gpt4 book ai didi

haskell - 根据数据的特定部分派(dispatch)生实例

转载 作者:行者123 更新时间:2023-12-02 16:27:31 25 4
gpt4 key购买 nike

我有以下代码

type Position = (Int,Int)

data CheckError where
LError :: Position -> LexerError -> CheckError
PError :: Position -> ParseError -> CheckError
SError :: Position -> StaticError -> CheckError

我需要它来实例 Ord,但只需比较每个构造函数中的 Position 字段即可。

我让它与这个一起工作:

data CheckError where
LError :: Position -> LexerError -> CheckError
PError :: Position -> ParseError -> CheckError
SError :: Position -> StaticError -> CheckError
deriving (Show)

instance Eq CheckError where
(LError l _) == (LError r _) = l == r
(LError l _) == (PError r _) = l == r
(LError l _) == (SError r _) = l == r
(PError l _) == (LError r _) = l == r
(PError l _) == (PError r _) = l == r
(PError l _) == (SError r _) = l == r
(SError l _) == (LError r _) = l == r
(SError l _) == (PError r _) = l == r
(SError l _) == (SError r _) = l == r

instance Ord CheckError where
compare (LError l _) (LError r _) = l `compare` r
compare (LError l _) (PError r _) = l `compare` r
compare (LError l _) (SError r _) = l `compare` r
compare (PError l _) (LError r _) = l `compare` r
compare (PError l _) (PError r _) = l `compare` r
compare (PError l _) (SError r _) = l `compare` r
compare (SError l _) (LError r _) = l `compare` r
compare (SError l _) (PError r _) = l `compare` r
compare (SError l _) (SError r _) = l `compare` r

但是我发现这段代码太重复了。有没有办法告诉 Haskell 直接与 Position 字段进行比较?

最佳答案

也许是这样?

 instance Eq CheckError where
a == b = pos a == pos b
where
pos (LError p _) = p
pos (PError p _) = p
pos (SError p _) = p

关于haskell - 根据数据的特定部分派(dispatch)生实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22364872/

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