2013-03-23 56 views
4

我一直在學習使用learnyouahaskell的Haskell,並且我遇到了一個我一直在嘗試的程序的問題。我想評估三個代表三角形邊的Num輸入,看它們是否代表一個直角三角形。以下是我迄今爲止:如何在Haskell中返回一個布爾值

isRight :: (Num a) => a -> a -> a -> Bool 
isRight x y z = (x^2 + y^2) == z^2 

顯然該函數將需要更長,以允許兩邊的不同訂單,但現在我無法使用該功能因這個錯誤在GCHI:

Could not deduce (Eq a) arising from use of '==' from the context (Num a) 
    bound by the type signature for 
     isRight :: Num a => a -> a -> a -> Bool 
    at isRight.hs:2:1-34 

很明顯,我不明白如何在Haskell中返回一個布爾類型,並且我一直無法在線找到任何有關這個問題的幫助。如果有人願意幫我解釋一下,我將不勝感激。先謝謝了!

回答

18

您的問題不在於返回Bool。麻煩的是,並非所有Num類型類的成員都是Eq類型類的成員。這將修復你的代碼。

isRight :: (Num a, Eq a) => a -> a -> a -> Bool 
isRight x y z = (x^2 + y^2) == z^2 

你可以閱讀更多關於類型類的的相關部分很預定你正在閱讀:Learn You a Haskell

+1

謝謝!所以說'(Num a,Eq a)'實質上是指'a'可以是'Num'或'Eq'類型的成員。 – lfnunley 2013-03-23 06:12:48

+11

@lfnunley:這意味着'a'是* Num和Eq(它必須是使用你的函數)的成員。如果它只是一個成員,那麼它不符合該類型。 – Chuck 2013-03-23 06:16:55

+0

爲了使用'(^)'和'(+)',你需要'Num',並且你需要'Eq'才能使用'(==)'。 – Landei 2013-03-25 10:09:17