我完全不了解Haskell(以及更普遍的函数式编程),所以如果这些内容非常基础,请原谅。为了更深入地了解,我尝试在Haskell中实现一些算法问题。我有一个简单的模块Interval
,用于实现线上的区间。它包含类型
data Interval t = Interval t t
辅助函数
makeInterval :: (Ord t) => t -> t -> Interval t
makeInterval l r | l <= r = Interval l r
| otherwise = error "bad interval"
还有一些关于区间的实用函数。
在这里,我对多维区间(d-intervals)感兴趣,这些对象由d个区间组成。我想单独考虑d个不相交线段的并集(多重区间)和d条分别在d个不同直线上的线段的并集(轨道区间)。考虑到不同的算法处理方式,我认为最好有两种不同类型(即使两者都是区间列表),比如
import qualified Interval as I
-- Multilple interval
newtype MInterval t = MInterval [I.Interval t]
-- Track interval
newtype TInterval t = TInterval [I.Interval t]
为了允许进行不同的健康检查,例如:
makeMInterval :: (Ord t) => [I.Interval t] -> MInterval t
makeMInterval is = if foldr (&&) True [I.precedes i i' | (i, i') <- zip is (tail is)]
then (MInterval is)
else error "bad multiple interval"
makeTInterval :: (Ord t) => [I.Interval t] -> TInterval t
makeTInterval = TInterval
我现在进入正题了!但是有些函数自然涉及到多个间隔和轨道间隔。例如,一个名为
order
的函数将返回多个间隔或轨道间隔中的间隔数。我该怎么办?添加什么呢?-- Dimensional interval
data DInterval t = MIntervalStuff (MInterval t) | TIntervalStuff (TInterval t)
这并没有太大帮助,因为如果我理解正确的话(如果我错了请纠正我),我需要写:
order :: DInterval t -> Int
order (MIntervalStuff (MInterval is)) = length is
order (TIntervalStuff (TInterval is)) = length is
当is
是MInterval
或TInterval
时,调用order
函数形式为order (MIntervalStuff is)
或order (TIntervalStuff is)
。这看起来不太好。我也不想复制函数(我有很多与多个和轨道间隔有关的函数,以及一些其他的d间隔定义,如等长多个和轨道间隔)。
我感到完全错误,并且错过了Haskell中类型的一些重要点(和/或无法在此处忘记足够的OO编程)。因此,作为一个新手问题,什么是在Haskell中处理这种情况的最佳方法?我必须忘记引入MInterval
和TInterval
并只使用一种类型吗?
非常感谢您的帮助,
Garulfo
foldr (&&) True
的结果等同于and
。 - Nefrubyr