[...]一对函数
tofun : int -> ('a -> 'a)
和fromfun : ('a -> 'a) -> int
,(fromfun o tofun) n
评估每n
n : int
个。{/ p>
任何人都可以向我解释这实际上是在寻求什么?我正在寻找更多的解释,而不是对此的实际解决方案。
答案 0 :(得分:2)
这要求的是:
1)高阶函数tofun
当给定整数时返回一个多态函数,一个类型为'a->'a
的函数,意味着它可以应用于任何类型的值,返回一个值相同类型。这种功能的一个例子是:
- fun id x = x;
val id = fn : 'a -> 'a
例如id "cat" = "cat"
和id () = ()
。后面的值是unit类型,它是一个只有1个值的类型。请注意,从unit
到unit
只有1个函数(即id
或等价物)。这强调了提出定义tofun
的难度:它返回类型'a -> 'a
的函数,除了身份函数之外,很难想到其他函数。另一方面 - 此类函数可能无法终止或可能引发错误,仍然具有类型'a -> 'a
。
2)fromfun
应该采用类型'a ->'a
的函数并返回一个整数。所以例如fromfun id
可能评估为0(或者如果你想变得棘手,它可能永远不会终止或者它可能会引发错误)
3)这些应该是彼此的反转,以便例如fromfun (tofun 5)
需要评估为5。
直观地说,在一个足够纯粹的函数式语言中,这是不可能的。如果在SML中是可能的,我的猜测是通过使用SML的一些不纯的特征(允许副作用)来违反参照透明度。或者,技巧可能涉及提高和处理错误(这也是SML的不纯特征)。如果你找到一个在SML中有效的答案,那么看看它是否可以翻译成烦人的纯函数语言Haskell会很有趣。我的猜测是它不会翻译。
答案 1 :(得分:1)
您可以设计以下属性:
fun prop_inverse f g n = (f o g) n = n
包含tofun
和fromfun
的定义,
fun tofun n = ...
fun fromfun f = ...
您可以测试他们是否支持该财产:
val prop_test_1 =
List.all
(fn i => prop_inverse fromfun tofun i handle _ => false)
[0, ~1, 1, valOf Int.maxInt, valOf Int.minInt]
正如约翰所说,这些功能必须是不纯的。我也有例外。