2013-06-29 3 views
2

другие вопросы и проблемы, хотя они похожи, не совсем такие. в этой конкретной ошибке компилятора, Haskell GHC не будет компилировать следующий код по следующей причине. Я совсем не понимаю - код довольно прямолинейный.Нет экземпляра для (Ord int), возникающего из-за использования `> ', Haskell

--factorial 

fact :: int -> int 
fact 0 = 1 
fact n | n > 0 = n * fact(n - 1) 

main = print (fact 10) 

(ошибка :)

No instance for (Ord int) arising from a use of `>' 
Possible fix: 
add (Ord int) to the context of 
the type signature for fact :: int -> int 
In the expression: n > 0 
In a stmt of a pattern guard for 
an equation for `fact': 
n > 0 
In an equation for `fact': fact n | n > 0 = n * fact (n - 1) 

Можете ли вы объяснить эту проблему для меня?

ответ

4

Int является то, что вы хотите:

fact :: int -> int 

->

fact :: Int -> Int 

Поскольку в Haskell, типы должны начинаться с крышкой.

Edit: Спасибо Юрась для комментирования этого:

Или, если вы хотите, вы можете использовать класс типа:

fact :: Integral a => a -> a 

А вы можете назвать переменную типа в зависимости от того что угодно, в том числе int. Кроме того, Num может лучше соответствовать вашей цели, если вы хотите определить факториал по общим номерам.

+0

Почему не 'Num int => int -> int'? :) – Yuras

+1

@Yuras Ммм, это лучше - я бы предпочел «Интеграл», но хороший намек! –

+0

* лицоpalm * спасибо. Это моя первая программа (которая содержит функцию), которую я когда-либо писал и компилировал с помощью Haskell. – bimmo