我想通过更改一个字段来更新记录语法,所以我做了类似的事情:
let rec = rec{field = 1}
但我发现我无法打印rec
不再,意味着当我尝试时编译器似乎进入无限循环。所以我尝试这样做:
let a = 1 -- prints OK
let a = a -- now i can't print a (also stuck in a loop)
所以我做不到let a = a
任何类型,但我不明白为什么,以及我应该如何解决这个问题。
顺便说一句:在做的时候:
let b = a {...record changes..}
let a = b
有效,但似乎多余。
你遇到的问题是all let
and where
Haskell 中的绑定默认是递归的。所以当你写的时候
let rec = rec { ... }
它尝试定义一个循环数据类型,当您尝试评估它时,它将永远循环(就像let a = a
).
没有真正的解决办法——这是语言的权衡。它使递归函数(甚至普通值)更容易编写,噪音更少,但也意味着您不能轻松地重新定义a
就其本身而言,有很多次。
你真正能做的唯一一件事就是给你的价值观起不同的名字——rec
and rec'
将是执行此操作的常用方法。
公平地说,Haskell 经常会出现递归函数甚至递归值。代码如下
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
一旦你掌握了它的窍门,就会非常好,并且不必明确地将这个定义标记为递归(就像你必须在 OCaml 中所做的那样)是一个明确的好处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)