kaw*_*han 1 haskell types pattern-matching
假设我有一个包含各种对象坐标的类型,定义如下:
type Point = (Int, Int)
data Object = A Point
| B Point
| C Point
Run Code Online (Sandbox Code Playgroud)
我想创建一个检查对象重叠的函数,就像这样
checkOverlap:: Object -> Point -> Bool
Run Code Online (Sandbox Code Playgroud)
我想只定义一个适用于所有对象的函数,而不必指定"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
Run Code Online (Sandbox Code Playgroud)
如果您不允许更改定义并且提取点是一项常见任务,则可以简单地添加getPoint为附加功能.case如果您不想getPoint多次写,可以使用此方法:
getPoint :: Object -> Point
getPoint obj = case obj of
A pt -> pt
B pt -> pt
C pt -> pt
Run Code Online (Sandbox Code Playgroud)
如果你不想要一个额外的功能,但仍然只想要一个版本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
Run Code Online (Sandbox Code Playgroud)