Haskell 类型类和重复行为

Haskell typeclass and duplicate behaviour

我是 Haskell 的新手,正在尝试概括程序中的某些行为,以减少代码量并获得更简单的整体解决方案。

假设我有这种代表 post 代码的类型,例如'ABC 123':

type PostCode = ((Char, Char, Char), (Int, Int, Int))

并且 PostCode 的行为应该是循环的;即 AAA 000AAA 001 之前; 'A' 到 'Z' 对于 Char 应该说唱,对于 Int.

应该是 0-9

因此我提取了这种类型 class:

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

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

我怎样才能正确地抽象出这种行为?有没有办法让 IntChar 都具有循环行为,而无需两个不同的实现?我还可以使用哪些其他 Haskell 功能?

您可以在类型 class 中为 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