我開始學習Haskell,我試圖指定一個任意的Int型別的零階函式的Haskell型別簽名。根據我的理解,對于一階函式,它應該是類似于k :: Int -> Int的東西。這是否意味著零階函式的型別簽名將只是k :: Int,或者這樣的假設是錯誤的?預先感謝您!
uj5u.com熱心網友回復:
Haskell中沒有 "零階 "函式。Haskell中的每個函式都有1的arity:每個函式都需要一個引數,并且它回傳一個值。回傳值本身可以是另一個函式。
k :: Int不是一個函式;它只是一個Int。
在Haskell中最接近arity為0的函式的是() -> a型別的函式,用于某個a型別。因為只有一個()型別的值,所以只有一種方法來呼叫這個函式:用()。
k :: () -> Int
k()= 3
(你可能會注意到,對于每個型別的a的值,正好有一個() -> a的函式;這是一個具有某種理論重要性的問題,但與這里的問題并不相關。)
uj5u.com熱心網友回復:
有一類信念是以 "Haskell中的每個函式正好有一個引數 "開始的。這些信念是有用的:它們構成了談論Haskell和理解Haskell行為的一種非常精確的方式的基礎。
但是它們對于我的口味來說總是有點過于強硬。盡管->型別的前身是二進制的,所以從技術上講,一個函式有一個引數和一個回傳型別,但我認為有一個談論和思考Haskell的速記方法還是很有用的,它允許你在精神上和口頭上將一個類似a -> (b -> c)的型別劃分為 "一個有兩個引數的函式"。然后,顯而易見的泛化是計算你必須在一個箭頭的右邊走多少次才能到達一個非箭頭的型別,所以a -> (b -> c)是泛化2,Bool -> Bool -> Bool -> Bool是泛化3,而Int是泛化0。
如果你允許自己有這樣的靈活性,那么你也可以更靈活地談論順序,所以 "順序 "的自然概括是計算在你被迫在一個非箭頭型別的底部之前,你可以向箭頭左邊走多少次。所以,Bool -> Bool有順序1,(a -> b) -> [a] -> [b]有順序2(和arity 2),((Int -> r) -> r) -> Cont r Int有順序3。 ......而在你允許自己有這種靈活性的世界里,我認為把Int說成是一個階數為0、arity為0的函式是完全自然的。(而且,事實上,我們可以推匯出所有的0階函式都是0次方的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/329808.html
標籤:
