以下に示すコードはコンパイルされます。
data Car p q r = Car {company :: p
, model :: q
, year ::r
} deriving (Show)
tellCar :: (Show a) => Car String String a -> String
「tellCar」でのみ「Showa」を実行する必要があることを思い出させる基本的な原則/規則/ロジックは何ですか?他のオプションはありませんか?そのような原則/慣習/論理を学ぶためのリソースはどこにありますか?
誤ってtellCarで「ShowCar」を取得すると、コンパイル時に次のエラーメッセージが表示されます。
*Main> :load "/home/optimight/baby.hs"
[1 of 1] Compiling Main ( /home/optimight/baby.hs, interpreted )
/home/optimight/baby.hs:96:18:
Expecting three more arguments to `Car'
In the type signature for `tellCar':
tellCar :: Show Car => Car String String a -> String
Failed, modules loaded: none.
誤ってtellCarで「Showz」を取得すると、コンパイル時に次のエラーメッセージが表示されます。
*Main> :load "/home/optimight/baby.hs"
[1 of 1] Compiling Main ( /home/optimight/baby.hs, interpreted )
/home/optimight/baby.hs:96:1:
Ambiguous constraint `Show z'
At least one of the forall'd type variables mentioned by the constraint
must be reachable from the type after the '=>'
In the type signature for `tellCar':
tellCar :: Show z => Car String String a -> String
Failed, modules loaded: none.
tellCarで誤って「ShowString」を取得すると、コンパイル時に次のエラーメッセージが表示されます。
Prelude> :load "/home/optimight/baby.hs"
[1 of 1] Compiling Main ( /home/optimight/baby.hs, interpreted )
/home/optimight/baby.hs:96:1:
Non type-variable argument in the constraint: Show String
(Use -XFlexibleContexts to permit this)
In the type signature for `tellCar':
tellCar :: Show String => Car String String a -> String
Failed, modules loaded: none.