создайте функцию, которая генерирует список чисел от a до b

#haskell

#хаскелл

Вопрос:

Я хочу написать функцию, которая генерирует список всех чисел между a ними и b ожидает тех, которые указаны в другом списке:

 generate :: Int -> Int -> [Int] -> [Int]
 

Пример

  • входные данные: generate 2 6 [10,3,5,8]
  • вывод: [2,4,6]

Комментарии:

1. Вы можете разделить задачу на две части: сначала сгенерировать список чисел от a до b , а затем, учитывая этот список , удалить все числа , которые также входят l .

2. скорее всего, это какая-то домашняя работа, поэтому вот несколько советов: вы можете получить сам список с помощью just [a..b] (дано a и b разумно) — затем взгляните на delete ( hackage.haskell.org/package/base-4.7.0.0/docs /… )

3. Будет ли понимание списка приемлемым в решении? Я думаю, вы могли бы взглянуть на это тоже для решения такого рода проблем.

Ответ №1:

Несмотря на то, что это, скорее всего, домашнее задание, я думаю, вы можете чему-то научиться, если я дам вам такой ответ:

 import Data.List (delete)

generate :: Int -> Int -> [Int] -> [Int]
generate a b = foldl (flip delete) [a..b]
 

Вот ваш пример в ghci:

 Prelude Data.List> generate 2 6 [10,3,5,8]
[2,4,6]   
 

Теперь попытайтесь понять части и что здесь происходит — возможно, задайте несколько вопросов в комментариях.

Комментарии:

1. Я не могу понять, что на самом деле делает волшебное «флип-удаление», я знаю, что делает удаление, но не знаю, что они делают вместе

2. ах да… посмотрите на определение / подпись foldl … (подсказка: вам не нужно flip , если вы используете foldr вместо этого) — и, конечно flip f a b = f b a же, он просто переворачивает аргументы )

3. Спасибо за время и за ответ, который я пытался сделать другим способом, возможно, я не понимаю сути Haskell и функционального программирования, и это создает проблему.

4. почему бы вам не добавить к своему вопросу то, что вы пытались сделать? Есть несколько способов сделать что-то — не позволяйте себе разочаровываться. Сначала вы должны отучиться от этого неприятного императивного и объектно-ориентированного мусора 😉

5. Вероятно, следует использовать foldl' , насколько я могу судить, нет причин для такой дополнительной лени.