PolyML函数和类型

时间:2016-11-24 19:24:51

标签: function types sml polyml

  

[...]一对函数tofun : int -> ('a -> 'a)fromfun : ('a -> 'a) -> int(fromfun o tofun) n评估每n n : int个。{/ p>

任何人都可以向我解释这实际上是在寻求什么?我正在寻找更多的解释,而不是对此的实际解决方案。

2 个答案:

答案 0 :(得分:2)

这要求的是:

1)高阶函数tofun当给定整数时返回一个多态函数,一个类型为'a->'a的函数,意味着它可以应用于任何类型的值,返回一个值相同类型。这种功能的一个例子是:

- fun id x = x;
val id = fn : 'a -> 'a

例如id "cat" = "cat"id () = ()。后面的值是unit类型,它是一个只有1个值的类型。请注意,从unitunit只有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

包含tofunfromfun的定义,

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]

正如约翰所说,这些功能必须是不纯的。我也有例外。