[英]PolyML Functions and Types
[...]一對函數
tofun : int -> ('a -> 'a)
和fromfun : ('a -> 'a) -> int
這樣(fromfun o tofun) n
n
為每n : int
計算n : int
。
任何人都能向我解釋這實際上是在尋求什么? 我正在尋找更多的解釋,而不是對此的實際解決方案。
這要求的是:
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會很有趣。 我的猜測是它不會翻譯。
您可以設計以下屬性:
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]
正如約翰所說,這些功能必須是不純的。 我也有例外。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.