Что не так с этим простым определением типа? (Ожидается еще один аргумент)

базовый.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 загружается, как и ожидалось. Почему приведенная выше версия неприемлема?


person 8128    schedule 15.10.2012    source источник


Ответы (2)


Поскольку ваша версия на самом деле не предоставляет тип. Floating — это класс типов. Если вы хотите разрешить любое плавающее значение, то Floating a => a -> a будет правильным. В противном случае вы можете попробовать либо Float -> Float, либо Double -> Double.

Просто чтобы конкретизировать это немного больше: Floating a => a -> a говорит не только о том, что ваша функция принимает любой тип Floating, но и о том, что она возвращает тот же тип, который был передан. Это должно быть правдой, даже если вы сузите тип. Например, вы не сможете использовать Float -> Double без дополнительных преобразований.

person Dan    schedule 15.10.2012

Floating — это не тип, это тип класс. Вы не можете использовать класс типа как тип, как вы. Когда вы говорите Floating в Haskell, вы утверждаете, что следующий тип является экземпляром класса. Так, например, вы можете написать код как

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

который вы можете неофициально прочитать как: для любого типа a, если a является экземпляром класса Floating, то areaCircle можно использовать как функцию от a до a.

Вы можете думать о Floating как о прилагательном. Он описывает виды. Но вы пытаетесь использовать его как существительное, т.е. как сам тип.

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

person sigfpe    schedule 15.10.2012