gpt4 book ai didi

haskell - Haskell 中类型的模式匹配

转载 作者:行者123 更新时间:2023-12-02 15:30:50 24 4
gpt4 key购买 nike

假设我有一个包含各种对象坐标的类型,定义为:

   type Point = (Int, Int)

data Object = A Point
| B Point
| C Point

我想创建一个函数来检查对象是否重叠,就像这样

   checkOverlap:: Object -> Point -> Bool

我只想定义一个适用于所有对象的函数,而不必指定“checkOverlap (A point) (x,y)”、“checkOverlap (B point) (x,y)”等。

我用谷歌搜索了这个问题,但我能找到的唯一解决方案是添加一个中间类型来收集所有不同的对象,以便您可以对该类型进行模式匹配。然而,由于这是一项家庭作业,我不允许修改大块代码来适应这种新类型。

还有别的办法吗?甚至可能没有模式匹配。不得不多次复制同一个函数似乎是糟糕的编程。

最佳答案

如果允许更改 Object 的定义,则可以使用记录语法:

type Point = (Int, Int)

data Object = A { getPoint :: Point, ... }
| B { getPoint :: Point, ... }
| C { getPoint :: Point, ... }

checkOverlap :: Object -> Point -> Bool
checkOverlap obj pt = doSomething (getPoint obj) pt

如果您不允许更改定义并且点的提取是一项常见任务,您可以简单地添加 getPoint 作为附加函数。如果你不想多次编写 getPoint,你可以使用 case:

getPoint :: Object -> Point
getPoint obj = case obj of
A pt -> pt
B pt -> pt
C pt -> pt

如果你不想要一个额外的功能,但仍然只想要一个版本的checkOverlap,你可以将case移动到checkOverlap :

checkOverlap :: Object -> Point -> Bool
checkOverlap obj pt = let opt = case obj of {A a -> a; B b -> b; C c -> c}
in -- use opt and pt

关于haskell - Haskell 中类型的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26445900/

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