Haskell类型类和重复行为

时间:2015-11-11 13:19:43

标签: haskell typeclass

我是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

这给我留下了几个明显的观点:

  • minmax的概念重复

  • 下一个是Int的重新实现,只有真正的差别是它的最小值和最大值,以及类型

如何正确抽象这种行为?有没有办法让IntChar的循环行为没有两个不同的实现?我可以使用其他什么Haskell功能?

1 个答案:

答案 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