【发布时间】:2013-08-15 22:41:43
【问题描述】:
我正在尝试创建一个以值元组形式返回自身的函数。基本上,这个想法是调用者将返回转换后的值,以及一个新的(curried)版本的函数,以便在处理中进一步使用。
但是,目前,我一直在尝试提出此功能的无操作(即无操作)版本。所以下面的 sn-p 显然没问题 - 这是一个不返回自身的空操作:
noOp s as xs = (s, as, xs)
但如果我改成这样:
noOp s as xs = (s, as, xs, noOp)
我收到“无限类型”错误:
Occurs check: cannot construct the infinite type:
t3 = t0 -> t1 -> t2 -> (t0, t1, t2, t3)
In the expression: noop
In the expression: (s, as, xs, noop)
In an equation for `noop': noop s as xs = (s, as, xs, noop)
关于处理无限类型错误有很多关于 SO 的讨论 - 但我不太清楚如何应用到我的问题。
欢迎任何建议...
【问题讨论】:
-
为什么要再次返回相同的函数?
-
尝试写类型,你就会明白为什么 ghc 抱怨了。
-
在某处引入一个新类型(
data或newtype)以创建递归类型。例如,为noOp的返回类型创建一个新类型。 -
我再次返回相同的函数,因为正常使用将是一个柯里化函数,它接受一个带有一些状态信息的参数。所以基本思想是真正的(不是无操作版本)函数将返回具有不同状态的自身的新版本。