Haskell 类型类和重复行为
Haskell typeclass and duplicate behaviour
我是 Haskell 的新手,正在尝试概括程序中的某些行为,以减少代码量并获得更简单的整体解决方案。
假设我有这种代表 post 代码的类型,例如'ABC 123':
type PostCode = ((Char, Char, Char), (Int, Int, Int))
并且 PostCode
的行为应该是循环的;即 AAA 000
在 AAA 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
这给我留下了几个明显的观点:
min
和max
的概念是重复的
next 为 Int
重新实现,唯一真正的区别是它的最小值和最大值,以及类型
我怎样才能正确地抽象出这种行为?有没有办法让 Int
和 Char
都具有循环行为,而无需两个不同的实现?我还可以使用哪些其他 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
我是 Haskell 的新手,正在尝试概括程序中的某些行为,以减少代码量并获得更简单的整体解决方案。
假设我有这种代表 post 代码的类型,例如'ABC 123':
type PostCode = ((Char, Char, Char), (Int, Int, Int))
并且 PostCode
的行为应该是循环的;即 AAA 000
在 AAA 001
之前; 'A' 到 'Z' 对于 Char
应该说唱,对于 Int
.
因此我提取了这种类型 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
这给我留下了几个明显的观点:
min
和max
的概念是重复的next 为
Int
重新实现,唯一真正的区别是它的最小值和最大值,以及类型
我怎样才能正确地抽象出这种行为?有没有办法让 Int
和 Char
都具有循环行为,而无需两个不同的实现?我还可以使用哪些其他 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