:これらの2つの関数型定義の違いは何ですか?以下の些細な関数定義の
printLength1::(Num a)=>String->a
printLength1 s = length s
printLength2::String->Int
printLength2 s = length s
なぜ彼らは同じではありませんか?どのような状況で私はもう一方を選ぶべきですか?
と私はprintLength1のため、このエラーが出る:
Couldn't match type `a' with `Int'
`a' is a rigid type variable bound by
the type signature for rpnc :: String -> a at test.hs:20:1
In the return type of a call of `length'
In the expression: length s
In an equation for `rpnc': rpnc s = length s
私はこのエラーを理解しています。しかし、どうすればこの問題を解決できますか? 私はすでに剛体型変数についてここでいくつかの記事を読みましたが、それを修正する方法を理解できませんでした。 LearnYouAHaskell.com引用
ありがとうございます。私は言語に隠されたそのような癖はもうないと思います。 – osager
@osagerこれは奇抜ではありませんが、これは型システムの非常に基本的に重要な部分です。多型型(少なくとも1つの多型型)は、それらがどのように使用されるかによって具体的な型に変換されます。タイプが多型であると主張するタイプシグネチャを書く場合、実際には多型である必要があります。 – Carl
'Num'クラスは変わったものではありませんが、' Num'はむしろquirkではなく 'length'が' Int'であると合理的に主張することができます。 –