Функция Haskell List (карта, zip и т. Д.) С исправлением - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь изучить haskell и выполнить упражнение -try, чтобы переписать стандартную операцию со списком (map, foldr, zip, iterate и т. Д.) С исправлением функции.У меня есть пример с повторением:

repeat a = fix $ \xs -> a : xs

, и это еще больше упрощает

repeat a = fix (a:)
repeat = fix . (:)

Может кто-нибудь помочь мне с картой?Извините за мой плохой английский и заранее благодарю.

1 Ответ

6 голосов
/ 13 марта 2019

Чтобы использовать fix, нужно написать рекурсивное определение в виде

map = .... something involving map .... 

Затем мы даем

map = fix (\m -> .... something involving m ....)

Например,

map = \f xs -> case xs of
   []   -> []
   y:ys -> f y : map f ys

так

map = fix (\m f xs -> case xs of
   []   -> []
   y:ys -> f y : m f ys)

В качестве альтернативы, поскольку аргумент f одинаков для каждого рекурсивного вызова, мы можем позволить

map f = \xs -> case xs of
   []   -> []
   y:ys -> f y : map f ys

и получите

map f = fix (\m xs -> case xs of
   []   -> []
   y:ys -> f y : m ys)
...