Операция FunSet Elm- fold

#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) вместо