gpt4 book ai didi

haskell - 为什么GHC说这两种类型不一样?我怎样才能让它们相同?

转载 作者:行者123 更新时间:2023-12-03 13:36:43 25 4
gpt4 key购买 nike

我定义了一个类:

class Query a where
filter :: a -> (b -> Bool) -> [b]
ifilter :: a -> (b -> Bool) -> [(b, Int64)]

我有一个用户定义的类型:
data Segment a = Segment {
extents :: [Extent],
array :: [a]
} deriving(Eq, Show)

最后,我尝试使 Segment 成为 Query 的实例:
instance Query (Segment a) where
filter = filterSegment
ifilter = ifilterSegment

函数 filter 和 ifilter 都接受一个 (Segment a) 和一个函数 (a->Bool) 并返回 [a] 或 [(a,Int64)]。

但是,我收到以下错误:
Couldn't match type `a' with `b'
`a' is a rigid type variable bound by
the instance declaration at src/Store/DataColumn.hs:19:10
`b' is a rigid type variable bound by
the type signature for filter :: Segment a -> (b -> Bool) -> [b]
at src/Store/DataColumn.hs:20:3
Expected type: Segment a -> (b -> Bool) -> [b]
Actual type: Segment a -> (a -> Bool) -> [a]
In the expression: filterSegment
In an equation for `filter': filter = filterSegment
In the instance declaration for `Query (Segment a)'

Couldn't match type `a' with `b'
`a' is a rigid type variable bound by
the instance declaration at src/Store/DataColumn.hs:19:10
`b' is a rigid type variable bound by
the type signature for
ifilter :: Segment a -> (b -> Bool) -> [(b, Int64)]
at src/Store/DataColumn.hs:21:3
Expected type: Segment a -> (b -> Bool) -> [(b, Int64)]
Actual type: Segment a -> (a -> Bool) -> [(a, Int64)]
In the expression: ifilterSegment
In an equation for `ifilter': ifilter = ifilterSegment
In the instance declaration for `Query (Segment a)'

我不确定我在这里错过了什么。我确实希望 (Segment a) 中的 'a' 与 (a->Bool)、[a] 和 [(a, Int64)] 中的 'a' 相同。但是,我无法弄清楚如何做到这一点。任何帮助,将不胜感激。

最佳答案

您对类型类的定义对 b 没有限制。可以,这意味着应该允许用户为 b 选择任何类型。他要。当然,您的实例定义不允许这样做,这就是它被拒绝的原因。

您想说的是“a 参数化了类型 b,这就是我想要使用的类型 b”。你是这样说的:

class Query a where
filter :: a b -> (b -> Bool) -> [b]

然后你写 instance Query Segment而不是 instance Query (Segment t)因为 a在类型类定义中现在只代表 Segmentb代表 t .

关于haskell - 为什么GHC说这两种类型不一样?我怎样才能让它们相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28920994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com