2

タイピングについての簡単な質問です。

ghci:t [("a",3)]と入力すると、元に戻ります[("a",3)] :: Num t => [([Char], t)]

ファイル内で、タイプを次のように定義しました。

type list = [(String, Int)]

ghci で書いたのと同様に、定義した型でInts とs の両方をサポートするように型を変更するにはどうすればよいですか?Double

4

1 に答える 1

4

まず、コードにエラーがあります。データ型は大文字で始める必要があります。

type List = [(String, Int)]

(これStringはのタイプ同義語であることに注意してください[Char]。つまり、まったく同じタイプです)。ラウンドアバウトで問題を解決します。タプルの2番目のスロットでタイプを完全に一般的にすることができることに注意してください。

type List a = [(String,a)]

あなたのタイプが任意のタイプをパラメータ化するように。一部の関数で数値型に特化する必要がある場合は、関数ごとに個別にその特殊化を行うことができます。例えば:

foo :: Num a => List a
foo = [("Hello",1),("World",2)]

次のように、データ型に制約を含めることができます。

data Num a => List a = List [(String,a)]

ただし、すべての関数宣言に制約を含める必要があるNum a => ...ため、実際に入力を保存する必要はありません。このため、Haskellプログラマーは通常、「データ宣言に型制約を含めない」というルールに従います。

于 2012-06-13T11:25:19.353 に答える