1

私は Haskell の基本を学ぼうとしていますが、doubleMe型宣言が「不正な演算子」エラーをaddThree引き起こすのに、エラーがまったく発生しない理由を理解するのに苦労していますか?

doubleMe :: Int -> Int -> Int
doubleMe x = x + x


addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z

明確にしていただければ幸いです。

よろしくお願いします。

4

3 に答える 3

5

宣言には、各引数の型と結果の型が必要です。引数は1つしかないためdoubleMe、宣言はdoubleMe :: Int -> Int

于 2013-02-10T16:48:17.350 に答える
2

doubleMe型シグネチャは2つのパラメータを指定します。

そのまま1つだけ指定すると(doubleMe x)、右側は関数(Int -> Int)を返す必要があります

于 2013-02-10T16:59:24.880 に答える
1

このようなタイプの質問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

于 2013-02-10T19:59:28.057 に答える