我是Haskell&的新手。试图概括程序中的某些行为,以减少代码量,并提供更简单的解决方案。
说我有这种类型代表邮政编码,例如' ABC 123':
type PostCode = ((Char, Char, Char), (Int, Int, Int))
并且PostCode
的行为应该是循环的;即AAA 000
之前的AAA 001
; ' A'到了' Z' Char
的{{1}}应该快速回合,Int
应为0-9。
因此,我引用了这种类型:
class Cyclic a where
next :: a -> a
这很简单。
所以我每个人都有一个instance
:
-- import Data.Char
instance Cyclic Char where
next c = chr n
where nxt = (ord c) + 1
min = 65
max = 90
n = if (nxt > max) then min else nxt
instance Cyclic Int where
next i = n
where nxt = i + 1
min = 0
max = 9
n = if (nxt > max) then min else nxt
这给我留下了几个明显的观点:
min
和max
的概念重复
下一个是Int
的重新实现,只有真正的差别是它的最小值和最大值,以及类型
如何正确抽象这种行为?有没有办法让Int
和Char
的循环行为没有两个不同的实现?我可以使用其他什么Haskell功能?
答案 0 :(得分:4)
您可以在类型类中为next
提供默认实现,如:
import Data.Char (chr)
class (Ord a, Enum a) => Cyclic a where
min', max' :: a
next :: a -> a
next a = if max' < a' then min' else a'
where a' = succ a
instance Cyclic Char where
min' = chr 65
max' = chr 90
instance Cyclic Int where
min' = 0
max' = 9
或者,您可以使用在闭包中实现next
的辅助函数,如:
class Cyclic a where
next :: a -> a
-- a helper function to implement next within a closure
cycl :: (Ord a, Enum a) => a -> a -> (a -> a)
cycl min' max' a = if max' < a' then min' else a'
where a' = succ a
instance Cyclic Char where
next = cycl (chr 65) (chr 90)
instance Cyclic Int where
next = cycl 0 9