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には type の 3 つのパラメーターがありますEnum a => a。言い換えれば、a列挙可能である限り、どれでもかまいません。関数mzは、その値が型であると想定していますDouble。の型シグネチャを変更して、代わりに引数をkwad取ることをお勧めします。Double

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

kwadこれにより、入力する値がs であることが保証されるDoubleため、関数にも適していますmz!


Left次のように、引数を括弧で囲む必要もあります。

Left (mz0 a b c)

mz0 a b cこれは、結果全体を に入れ、それ以外には入れないことを意味しますLeft

于 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 に答える