【发布时间】:2019-09-24 17:53:29
【问题描述】:
这不是类型检查:
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 所以@987654330 @。
【问题讨论】:
-
“编译器可能有问题”。绝对是每个试图编译他们的第一个 Haskell 程序的人的第一句话。真正的原因绝不是编译器错误。
-
您也可以使用来自
Data.Bifunctor的first编写defaultEither = first . const。不过,我可能会称它为setLeft,因为Left并没有什么特别的默认。 -
@n.m.无论如何,对于初学者程序来说,它从来都不是编译器错误。有时肯定是在您尝试做更深奥的事情时。
-
虽然编译器有错误,但我的经验是,一旦你开始责怪编译器,它(接近)肯定不是。简而言之,
Either Int Int类型的Right x不是Either String Int的Right x。
标签: haskell types polymorphism