私は1週間前にハスケルを勉強し始めて、奇妙な問題が1つありました。私は単純なデータ型を作成し、それをコンソールに表示したいと思っています。自分のタイプの2つのコンストラクタに対して2つの関数を作成しました。 2つの引数を持つコンストラクタを使用すると、コンパイラは関数を呼び出すことができます。しかし、1つの引数を持つコンストラクタをキャッチする別の関数を呼び出すことはできません。異なるデータコンストラクタのための関数
module Main (
main
) where
data MyContainter a b = FirstVersion a b
| SecondVersion a
deriving(Show,Eq)
showContainer (FirstVersion a b) = show b
showContainer (SecondVersion a) = show a
--startF = showContainer (FirstVersion 1 2) -- it works
startF = showContainer (SecondVersion 1) -- it doesn't work
main = putStr startF
コンパイラは伝え:
Ambiguous type variable `a0' in the constraint:
(Show a0) arising from a use of `showMaybe'
Probable fix: add a type signature that fixes these type variable(s)
In the expression: showMaybe (SecondVersion 1)
In an equation for `startF': startF = showMaybe (SecondVersion 1)
なぜそれはそれを言うのでしょうか?私は(SecondVersion 1)を直接作成し、なぜコンパイラーがshowContainer(SecondVersion a)を呼び出さないのか理解していません。
showContainer :: (Show a, Show b) => MyContainer a b -> String
しかし、あなたはSecondVersion 1
を渡すとき、それは、b
が何であるかを知らないのでb
のあらゆるタイプのSecondVersion 1
作品:
エラーメッセージ中の型変数 'a0'が' b'と同じで、 'a'とは何の関係もないことを理解するのに役立ちます。 ( 'Show'クラスは' a'という名前を使っているのでコンパイラはその名前を選んでしまいました。 – hammar