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]
正如约翰所说,这些函数必须是不纯净的。我也会例外。谢谢你的建议,它很有洞察力,而且帮助很大!当我找到解决方案时,我会用它来回复,谢谢。