haskell - 如何与类型 "Either a b"匹配?

标签 haskell types

此特定代码部分的目的是使 size 函数比简单地计算 elems 中的所有元素更有效。我已经决定对构成列表的两种类型求和,但我似乎无法创建大小函数的签名。

instance (Finite a, Finite b) => Finite (Either a b) where
    elems = combineLists [Left x | x <- elems] [Right x | x <-elems]
    size ??? = (size a) + (size b)

从 Prelude 中,我们知道要么 a b = 左 a |右b

我尝试的第一件事是匹配Either,但当然它是一种类型,所以这不起作用。接下来,我尝试了 ((Left a) | (Right b)),但也没有继续下去。似乎没有其他东西与类型 Either a b 匹配。

我能够获得 size (Left a) 进行编译,但由于它缺少 b 组件,我收到错误:

Ambiguous type variable `b' in the constraint:
  `Finite b' arising from a use of `size' at <interactive>:1:0-12

这在上下文中当然是有意义的,但我真的不知道如何匹配Either a b

大家有什么想法吗?

最佳答案

某种类型的东西Either a bLeft aRight b ,因此您有两种可以单独处理的情况:

size (Left x) = size x
size (Right x) = size x

有关不明确类型变量的错误是一个单独的问题。 如果您只是输入类似 size (Left 1) 的内容进入解释器后,系统无法推断出该类型的“正确”类型 Left 1值将是。可能是Either Int <i>anything</i>只要不知道 <i>anything</i> 是什么类型是,无法检查它是否在类 Finite 中( size 需要)。

您可以通过指定显式类型签名来避免该问题:

size (Left 1 :: Either Int String)

关于haskell - 如何与类型 "Either a b"匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2309532/

相关文章:

haskell - Haskell 数据声明可以受类型值的限制吗

c - c中的unsigned int数据类型

ios - 遍历 .plist 字典。类型不匹配

Haskell 编译程序出现段错误

Haskell:为什么我的斐波那契数列实现效率低下?

haskell - 如何在 gtk2hs 中的事件处理程序之间传递状态

types - 我什么时候应该在普通元组上使用元组结构?

haskell - 即使在合格的导入后也出现 "Ambiguous occurrence"错误

haskell - 纯函数怎么做IO?

java - 编译时类型和运行时类型之间存在差异的原因是什么?