11

basic.hs:

areaCircle :: Floating -> Floating
areaCircle r = pi * r * r

指示:

*Main> :l basic.hs 
[1 of 1] Compiling Main             ( Sheet1.hs, interpreted )

Sheet1.hs:2:15:
    Expecting one more argument to `Floating'
    In the type signature for `areaCircle':
      areaCircle :: Floating -> Floating
Failed, modules loaded: none.

areaCircle :: Floating a => a -> a期待どおりにロードされていることがわかります。上記のバージョンが受け入れられないのはなぜですか?

4

2 に答える 2

24

あなたのバージョンは実際にはタイプを提供していないためです。Floating型クラスです。フローティングを許可する場合Floating a => a -> a、正しいです。Float -> Floatそれ以外の場合は、またはのいずれかを試すことができますDouble -> Double

もう少し肉付けするためにFloating a => a -> a、関数は任意の型を受け入れるだけでなく、Floating渡されたのと同じ型を返すことを示しています。型を絞り込んでもこれは間違いない。たとえば、Float -> Double追加の変換を行わないと使用できません

于 2012-10-15T21:34:29.703 に答える
15

Floating型ではなく、型クラスです。型クラスを自分のように型として使うことはできません。Haskellで言うとき、あなたFloatingは次のタイプがクラスのインスタンスであると主張しています。したがって、たとえば、次のようにコードを記述できます。

areaCircle :: Floating a => a -> a
areaCircle r = pi * r * r

これは非公式に次のように読むことができます。任意のタイプaの場合a、がクラスのインスタンスである場合は、関数fromからまでを使用できFloatingます。areaCircleaa

Floating形容詞のようなものと考えることができます。タイプについて説明します。しかし、あなたはそれを名詞のように使おうとしています。タイプ自体として。

http://en.wikipedia.org/wiki/Type_class

于 2012-10-15T21:37:51.783 に答える