#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'
, насколько я могу судить, нет причин для такой дополнительной лени.