gpt4 book ai didi

haskell - 创建方便类型

转载 作者:行者123 更新时间:2023-12-04 22:24:26 26 4
gpt4 key购买 nike

我从 Haskell 开始。我有一种情况,可以方便地使用以下类型的同义词:

type Adult = Int
type Youth = Int

但是我不能在 AdultYouth 上重载函数,即使它们是不同类型的同义词,所以必须有两个单独的函数版本,例如。 doSomethingForAdultdoSomethingForYouth ,所以接下来我尝试
data Person = Adult Int | Youth Int

然后我可以模式匹配并使用单一版本的函数,
但后来我放弃了在函数声明中使用 AdultYouth 作为类型的选项,这很方便。有没有中路?我查看了 Either ,但从教程中的描述来看,这似乎是误用?类似于以 Person 为根、派生 YouthAdult 并且仍然是 Int 同义词的小型类型层次结构的东西将是完美的,但我无法弄清楚如何。

最佳答案

我不明白这会如何滥用 Either 。正如 (,) 是一个通用的 product typeEither 作为一个通用的 sum type 是完全可以接受的,即任何形式:

data T = T1 A | T2 B C

...可以在代数上被认为是 A + (B * C) ,相当于 Either A (B, C)

另一方面,如果要区分 AdultYouth ,使用相同实际类型的同义词可能会适得其反;它们只是透明的别名。另一种方法是使用 newtype s,如下所示:
newtype Adult = Adult Int deriving (Eq, Ord, Show, Read, Num) 
newtype Youth = Youth Int deriving (Eq, Ord, Show, Read, Num)

根据口味调整 deriving 子句;我在这里添加 Num 因为底层类型是数字,但如果你想要的只是一个唯一标识符,那么添加或乘以它们就没有意义了。此时,您可以根据需要为 Person 使用 sum 类型,或者定义一个类型类以获得正确的重载:
class Person a where 
-- (etc...)

instance Person Adult where -- ...
instance Person Youth where -- ...

然后在 Person 中定义的任何函数在 AdultYouth 上有效地重载,让您 dispatch based on type the way "overloaded" functions in other languages do

关于haskell - 创建方便类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6667626/

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