【问题标题】:Haskell List function (map, zip, etc..) with fixHaskell 列表功能(地图、zip 等)与修复
【发布时间】:2019-08-03 12:53:27
【问题描述】:

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

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

它进一步简化了

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

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

【问题讨论】:

  • 这太宽泛了。展示您尝试过的内容,请注意您需要帮助的具体内容。
  • 这可能值得一看 - 或尝试提出(不难) - 首先是 map 的递归定义。然后我相信有一种相当“机械”的方式可以将其转化为使用fix

标签: list haskell fixpoint-combinators


【解决方案1】:

要使用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)

【讨论】:

  • 谢谢!这真的很有用。有了它我可以写filter和foldr,没那么复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
相关资源
最近更新 更多