haskell - 为什么不在 Haskell 中进行类型检查?

标签 haskell types polymorphism

这不是类型检查:

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/

相关文章:

haskell - 如何在haskell的一行中输入多个值

java - 调用从 Java 返回字符串的 Haskell 函数

c++ - 构建/销毁过程中的虚拟调用

haskell - 我应该总是更喜欢更通用的类型而不是特定的类型吗?

haskell - 完整的 Haskore 示例

haskell - 克隆羊型应如何构建

Haskell函数应用替换括号

python - 为什么 Node Express 将 Django 的 bool 值视为字符串?

types - Julia 设计 : Silently Defining/Naming Types in Macros

用于指定与参数类型相同的返回类型的 phpDoc 符号