[...] 一对函数tofun : int -> ('a -> 'a)
and fromfun : ('a -> 'a) ->
int
这样(fromfun o tofun) n
评估为n
对于每一个n : int
.
任何人都可以向我解释这实际上要求什么?我正在寻找更多对此的解释,而不是实际的解决方案。
这要求的是:
1)高阶函数tofun
当给定一个整数时,它返回一个多态函数,该函数具有类型'a->'a
,这意味着它可以应用于任何类型的值,返回相同类型的值。这种函数的一个例子是:
- fun id x = x;
val id = fn : 'a -> 'a
例如,id "cat" = "cat"
and id () = ()
。后面的值是unit类型,是只有1个值的类型。请注意,总共只有 1 个函数unit
to unit
(即,id
或同等的东西)。这强调了提出定义的难度tofun
:它返回一个类型的函数'a -> 'a
,除了恒等函数之外很难想到其他函数。另一方面——此类函数可能无法终止或可能引发错误但仍然具有类型'a -> 'a
.
2) fromfun
应该采用类型的函数'a ->'a
并返回一个整数。所以例如fromfun id
可能评估为 0 (或者如果你想变得棘手,它可能永远不会终止,或者可能会引发错误)
3)这些应该是彼此相反的,因此,例如fromfun (tofun 5)
需要评估为5。
直觉上,这在足够纯粹的函数式语言中应该是不可能的。如果在 SML 中可能的话,我的猜测是,这将是通过使用 SML 的一些不纯粹的功能(允许副作用)来违反引用透明度。或者,这个技巧可能涉及引发和处理错误(这也是 SML 的一个不纯粹的功能)。如果你找到一个在 SML 中有效的答案,那么看看它是否可以被翻译成烦人的纯函数语言 Haskell 将会很有趣。我的猜测是它不会翻译。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)