次のコードは、Double または Integer のいずれかを生成することを目的としています。または のいずれかs
であると想定されます。全体の部分; 小数部分または整数の場合。negate
id
n
f
Nothing
computeValue :: Num a => (a->a) -> Integer -> (Maybe Double) -> Either Double Integer
computeValue s n Nothing = Right $ s n
computeValue s n (Just a) = Left $ s (fromIntegral n + a)
これをコンパイルすると、次のようになります。
test1.hs:2:28:
Couldn't match type `Integer' with `Double'
Expected type: Either Double Integer
Actual type: Either Double a
In the expression: Right $ s n
In an equation for `computeValue':
computeValue s n Nothing = Right $ s n
test1.hs:2:38:
Couldn't match type `Integer' with `Double'
In the first argument of `s', namely `n'
In the second argument of `($)', namely `s n'
In the expression: Right $ s n
どういうわけか、コンパイラs
はポリモーフィックであるという事実を追跡できなくなったようです。ここで何が起こったのか、どうすれば修正できますか?