如何在Haskell中返回一个布尔值

lfn*_*ley 6 haskell

我一直在使用learnyouahaskell学习Haskell,而且我在尝试的程序中遇到了问题.我想评估表示三角形边的三个Num输入,看看它们是否代表一个直角三角形.这是我到目前为止:

isRight :: (Num a) => a -> a -> a -> Bool
isRight x y z = (x^2 + y^2) == z^2
Run Code Online (Sandbox Code Playgroud)

显然,该函数需要更长才能允许不同的边数,但是由于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
Run Code Online (Sandbox Code Playgroud)

显然我不明白如何在Haskell中返回一个布尔类型,我无法在线找到任何与此问题相关的帮助.如果有人帮我解释一下,我将不胜感激.

Nei*_*ter 21

问题不在于返回Bool.问题是并非所有Num类型类的成员都是Eq类型类的成员.这将修复您的代码.

isRight :: (Num a, Eq a) => a -> a -> a -> Bool
isRight x y z = (x^2 + y^2) == z^2
Run Code Online (Sandbox Code Playgroud)

您可以从您正在阅读的本书的相关部分阅读有关类型类的更多信息:了解您的Haskell.

  • @lfnunley:这意味着`a`是*Num和Eq(它必须与你的函数一起工作)的成员.如果它只是一个成员,那么它不满足该类型. (12认同)