2

我有简单的代码

delta a b c = b*b - (4*a*c)

mz1 :: Double -> Double -> Double -> Double
mz1 a b c = (-b - sqrt(delta a b c)) / (2*a)

mz2 :: Double -> Double -> Double -> Double
mz2 a b c = (-b + sqrt(delta a b c)) / (2*a)

mz0 :: Double -> Double -> Double -> Double
mz0 a b c = (-b) / (2*a)

kwad :: (Enum a) => a -> a -> a -> Either Double Bool
kwad a b c 
    | delta a b c == 0 = Left mz0 a b c
    | delta a b c < 0 = Right False
    | otherwise = Left mz1 a b c

我刚开始学习 Haskell,我不知道如何返回 Bool 或 Double,有人可以帮忙吗?

错误是:

Couldn't match expected type `a -> a -> a -> Either Double Bool'
            with actual type `Either (Double -> Double -> Double -> Double) >b0'
The function `Left' is applied to four arguments,
but its type `(Double -> Double -> Double -> Double)
              -> Either (Double -> Double -> Double -> Double) b0'
has only one
4

2 回答 2

4

您的kwad函数具有三个类型的参数Enum a => a。换句话说,a只要它是可枚举的,它们就可以取任意值。您的mz函数期望它们的值是 type Double。我建议更改的类型签名,kwad因此它需要Double参数,如下所示:

kwad :: Double -> Double -> Double -> Either Double Bool

这保证了您输入的值kwadDoubles,因此也适合您的mz函数!


您还需要将参数包装Left在括号中,如下所示:

Left (mz0 a b c)

这意味着您要将整个mz0 a b c结果放入 aLeft中,而不是其他任何东西。

于 2013-10-15T19:44:08.747 回答
3

它不是关于如何更正您的代码,而是展示Either a b.

通常它被用作Right answer,是的,就像正确的答案和Left error_message- 就像某事不正确。

当然,Either a b它的这个含义只存在于大脑内部,在数学Left上与Right. 但不是每次。例如,标准instance Monad (Either a)用作Left错误。

所以,更令人愉快的代码将Either Bool Double在你的例子中。

但 ...

如果你想写类似Left doesn'tMatter或更简单的东西Left (),这是这种情况下的另一个数据 - Maybe a

您可以将示例重写为... -> Maybe Double

| wrong_pattern -> Nothing
| right_pattern -> Just (mz0 a b c)
于 2013-10-15T22:51:24.227 回答