從我的講座中,我了解到運算式的型別(n `mod` 2 == 0)是Int -> Bool為什么不是Int -> Int -> Bool?
n `mod` 2有型別(Int -> Int),如果我們寫n `mod` 2在表單中,g = h(n)那么(n `mod` 2 == 0)可以寫成 g(m)具有型別Int -> Bool
的最后它應該是型別(Int -> Int -> Bool)嗎?
uj5u.com熱心網友回復:
(n `mod` 2 == 0)has as type Bool,實際上,運算式等效于(==) (mod n 2) 0and 因為如果它使用兩個引數則(==) :: Eq a => a -> a -> Bool回傳 a Bool,因此這意味著(n `mod` 2 == 0)具有 as 型別Bool。這將要求有一個n在范圍內命名的變數,并且n需要具有 as 型別n :: Integral a => a,因此型別的值是型別Integral類的成員。這也意味著mod n 2和0兩者必須屬于同一型別,并且該型別是Eqtypeclass的成員。
如果你構建一個函式n的引數,如再有型別,也可以進一步專注,要,因為它是一個映射引數的函式型別或專門為一個。\n -> n mod 2 == 0Integral a => a -> BoolInt -> BoolnIntegral a => aIntBool
出于同樣的原因,它不是Int -> Int -> Bool:它不接受任何引數,并且它(n `mod` 2 == 0)本身是一個計算結果為 a 的運算式Bool,因此它的型別是Bool。如果您要構造一個函式,例如\n -> \m -> n `mod` 2 == 0,則其型別為Integral a => a -> (b -> Bool)或不那么冗長Integral a => a -> b -> Bool。這里m可以是任何型別的值,它的值與函式的結果無關。因此,它只是一個“臨時”變數,用于使其成為一個帶有兩個引數的函式。
這同樣適用于n `mod` 2:此運算式的更規范形式 is mod n 2,因為modhas typemod :: Integral a => a -> a -> a是type的運算式Integral a => a。這種型別是相同的型別n和2。如果我們創建一個帶n引數的函式,那么,那么這個函式的型別是。的型別可被專門到,由于是成員型別類。\n -> n mod 2Integral a => a -> aInt -> IntIntIntegral
uj5u.com熱心網友回復:
它來自打字規則。Haskell 的規則比下面給出的要多一些,但你可以從這些開始。

規則 (3) 是唯一建構式的規則。你的運算式來自 (1,2,4)。
如果您需要有關這些規則的進一步幫助,請發表評論。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/374162.html
