这不是类型检查:
module DoesntTypeCheck where {
import Prelude(Either(..));
defaultEither :: a -> Either b c -> Either a c;
defaultEither a (Left _) = Left a;
defaultEither _ b = b;
}
但是这样做:
module DoesTypeCheck where {
import Prelude(Either(..));
defaultEither :: a -> Either b c -> Either a c;
defaultEither a (Left _) = Left a;
defaultEither _ (Right b) = Right b;
}
编译器可能有问题,Either a c
类型只能是Left (x::a)
或 Right (y::c)
,如果它不是 Left
那么它就是 Right
,我们知道 Right::b -> Either a b
所以 Right (y::c)::一个 c
。
最佳答案
问题是当你说
defaultEither _ b = b
你是说输出值 b
与第二个输入值相同。这只有在值具有相同类型时才有可能。但是您已经告诉编译器输入的类型为 Either b c
,而输出的类型为 Either a c
。这些是不同的类型,难怪编译器会提示。
我明白你想做什么 - 但即使值 Right x
(x
类型为 c
)本身对于任何 d
可以是 Either d c
类型,您的类型签名将输入和输出值限制为具有不同 d
的版本。这意味着您不能使用同一个变量来引用这两个值。
关于haskell - 为什么不在 Haskell 中进行类型检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56016314/