gpt4 book ai didi

Haskell 类型类和重复行为

转载 作者:行者123 更新时间:2023-12-02 14:15:08 28 4
gpt4 key购买 nike

我是 Haskell 的新手,并试图概括程序中的某些行为,以减少代码量并总体上提供更简单的解决方案。

假设我有这种代表邮政编码的类型,例如“ABC 123”:

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

并且PostCode的行为应该是循环的;即 AAA 000 出现在 AAA 001 之前; Char 的“A”到“Z”应该循环,Int 的 0-9 也应该如此。

因此我提取了这个类型类:

class Cyclic a where
next :: a -> a

这很简单。

所以我为每个都有一个实例:

-- 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 的概念重复

  • next 为 Int 重新实现,唯一真正的区别是其最小值和最大值以及类型

如何正确抽象这种行为?有没有办法让 IntChar 都具有循环行为,而无需两种不同的实现?我还可以使用哪些其他 Haskell 功能来代替?

最佳答案

您可以在类型类中为 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 类型类和重复行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33651399/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com