私は Haskell の基本を学ぼうとしていますが、doubleMe型宣言が「不正な演算子」エラーをaddThree引き起こすのに、エラーがまったく発生しない理由を理解するのに苦労していますか?
doubleMe :: Int -> Int -> Int
doubleMe x = x + x
addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z
明確にしていただければ幸いです。
よろしくお願いします。
私は Haskell の基本を学ぼうとしていますが、doubleMe型宣言が「不正な演算子」エラーをaddThree引き起こすのに、エラーがまったく発生しない理由を理解するのに苦労していますか?
doubleMe :: Int -> Int -> Int
doubleMe x = x + x
addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z
明確にしていただければ幸いです。
よろしくお願いします。
宣言には、各引数の型と結果の型が必要です。引数は1つしかないためdoubleMe、宣言はdoubleMe :: Int -> Int。
doubleMe型シグネチャは2つのパラメータを指定します。
そのまま1つだけ指定すると(doubleMe x)、右側は関数(Int -> Int)を返す必要があります
このようなタイプの質問ghciには、優れたツールです。:t式のタイプを尋ねるために使用します。
Prelude> let doubleMe x = x + x
Prelude> :t doubleMe
doubleMe :: Num a => a -> a
したがって、タイプはa -> a-他の回答がすでに指摘しているように、引数は2つではなく1つだけです。
IntHaskell は最も一般的な型シグネチャを導出しようとするため、取得できません。Num a =>そのため、代わりにget を取得します。つまり、型クラスのインスタンスであるdoubleMeすべての型(が定義されている) で機能し、 , , で機能することを意味します (少なくとも、より制限的な型を指定しない場合) )...aNum(+)doubleMeIntIntegerDoubleInt -> Int