-1

我尝试学习 haskell 并进行锻炼 - 尝试使用函数修复重写标准列表操作(map、foldr、zip、迭代等)。我有重复的例子:

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

它进一步简化

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

谁能帮我看地图?对不起我的英语不好,提前谢谢你。

4

1 回答 1

7

要使用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)
于 2019-03-12T23:05:32.160 回答