簡體   English   中英

PolyML函數和類型

[英]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個值的類型。 請注意, 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會很有趣。 我的猜測是它不會翻譯。

您可以設計以下屬性:

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]

正如約翰所說,這些功能必須是不純的。 我也有例外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM