Function PolyML函数和类型

Function PolyML函数和类型,function,types,sml,polyml,Function,Types,Sml,Polyml,[…]一对函数tofun:int->('a->'a)和fromfun:('a->'a)-> int使得(fromfun o tofun)n对于每个n:int计算为n 有人能向我解释这到底是什么要求吗?我在寻找更多的解释,而不是实际的解决方案。这要求的是: 1) 一种高阶函数tofun,当给定一个整数时,该函数返回一个多态函数,其类型为'A->'A,这意味着它可以应用于任何类型的值,返回相同类型的值。此类功能的一个示例是: - fun id x = x; val id = fn : 'a ->

[…]一对函数
tofun:int->('a->'a)
fromfun:('a->'a)->
int
使得
(fromfun o tofun)n
对于每个
n:int
计算为
n


有人能向我解释这到底是什么要求吗?我在寻找更多的解释,而不是实际的解决方案。

这要求的是:

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

- fun id x = x;
val id = fn : 'a -> 'a
例如,
id“cat”=“cat”
id()=()
。后面的值是unit类型,它是一个只有1个值的类型。请注意,从
unit
unit
(即
id
或类似的东西)总共只有一个函数。这突出了定义
tofun
的困难:它返回类型为
'a->'a
的函数,除了标识函数之外,很难想到其他函数。另一方面,这样的函数可能无法终止,或者会引发错误,并且仍然具有类型
'a->'a

2)
fromfun
应该采用
'a->'a
类型的函数并返回一个整数。因此,例如
fromfun id
可能计算为0(或者如果您想变得棘手,它可能永远不会终止,或者可能会引发错误)

3) 它们应该是彼此相反的,因此,例如,
fromfun(tofun 5)
需要计算为5


直觉上,这在一个足够纯粹的函数式语言中是不可能的。如果这在SML中是可能的,我的猜测是,它将通过使用SML的一些不纯特征(允许副作用)来违反引用透明度。或者,技巧可能涉及提出和处理错误(这也是SML的一个不纯特征)。如果您找到一个在SML中有效的答案,那么看看它是否可以翻译成令人烦恼的纯函数式语言Haskell将是一件有趣的事情。我猜它不会翻译。

您可以设计以下属性:

fun prop_inverse f g n = (f o g) n = n
val prop_test_1 =
    List.all
      (fn i => prop_inverse fromfun tofun i handle _ => false)
      [0, ~1, 1, valOf Int.maxInt, valOf Int.minInt]
以及
tofun
fromfun
的定义

fun tofun n = ...
fun fromfun f = ...
您可以测试它们是否支持该属性:

fun prop_inverse f g n = (f o g) n = n
val prop_test_1 =
    List.all
      (fn i => prop_inverse fromfun tofun i handle _ => false)
      [0, ~1, 1, valOf Int.maxInt, valOf Int.minInt]

正如约翰所说,这些函数必须是不纯净的。我也会例外。

谢谢你的建议,它很有洞察力,而且帮助很大!当我找到解决方案时,我会用它来回复,谢谢。