#elm #fold
#вяз #складывание
Вопрос:
Я пытаюсь решить этот вопрос.
type alias FunSet = Int -> Bool
contains : FunSet -> Int -> Bool
contains set elem = set elem
singletonSet : Int -> FunSet
singletonSet elem = inputElem -> elem == inputElem
union : FunSet -> FunSet -> FunSet
union a b = (x -> (contains a x) || (contains b x))
Моя функция fold должна выполнять следующее:
Принимает список наборов и возвращает новый набор, который создается путем применения operation
функции fold using .
fold: List FunSet -> ( FunSet -> FunSet -> FunSet ) -> FunSet
fold operation sets =
Пример:
(fold union [(singletonSet 1), (singletonSet 2), (singletonSet 3)]) 1 == True
Мне не ясно, как мне это сделать. Надеюсь, кто-нибудь сможет помочь ^^
Ответ №1:
Для этого можно использовать List.foldl
или List.foldr
:
fold sets f =
case sets of
[] -> _ -> False
x :: xs -> List.foldl f x xs
Я чувствую, что было бы проще определить emptySet _ = False
и напрямую использовать List.foldl
:
List.foldl union emptySet [(singletonSet 1), (singletonSet 2), (singletonSet 3)]
Обратите внимание, что первый параметр List.foldl
— это функция, которая принимает сначала элемент, а затем накопитель, а не наоборот, поэтому вы не можете просто использовать fold sets diff
, вам придется использовать fold sets (flip diff)
для переключения аргументов.
Комментарии:
1. Хорошо. Я заставил это работать для union. Но теперь у меня другая проблема, я пытаюсь сделать то же самое и для difference. Для этого примера: (сложите diff [setOf [1, 2, 3], setOf [1], setOf [2]] ) 3 == True
2. @Myii С какой проблемой вы столкнулись?
3. для этого примера он должен возвращать True , но возвращает False . Я тоже не очень понимаю концепцию использования fold для разницы. У меня есть отдельная функция diff: diff : FunSet -> FunSet -> FunSet diff a b = (x -> содержит x amp;amp; (не (содержит b x))). Как я должен применить fold к этому?
4. @Myii Это из-за порядка аргументов. Попробуйте
(b a -> diff a b)
вместо