gpt4 book ai didi

haskell - Int vs Word 常用吗?

转载 作者:行者123 更新时间:2023-12-02 07:34:37 25 4
gpt4 key购买 nike

似乎获取/返回Int(即ByteString.hGetData.List.length)的常见模式与使用强描述类型的 Haskell 模式,因为其中许多情况只能处理正数。使用 Word 不是更好吗?或者这些函数偏向于 Int 是否有原因?

最佳答案

确实,Haskell 类型系统的表达能力鼓励用户为他们定义的实体分配精确的类型。然而,经验丰富的 Haskellers 很容易承认,必须在最终类型精度(此外,鉴于 Haskell 类型系统的当前限制,这并不总是能够实现)和便利性之间取得平衡。简而言之,精确类型仅在一定程度上有用。除此之外,它们往往只会导致额外的官僚主义,而几乎没有任何好处。

让我们用一个例子来说明这个问题。考虑阶乘函数。对于所有大于 1 的 nn 的阶乘是偶数,而 1 的阶乘并不是很有趣,所以我们忽略它。因此,为了确保 Haskell 中阶乘函数的实现是正确的,我们可能会想引入一种新的数字类型,它只能表示无符号偶数:

module (Even) where

newtype Even = Even Integer

instance Num Even where
...
fromInteger x | x `mod` 2 == 0 = Even x
| otherwise = error "Not an even number."

instance Integral Even where
...
toInteger (Even x) = x

我们将此数据类型密封在一个不导出构造函数的模块内,使其抽象,并使其成为 Int 实例的所有相关类型类的实例。现在我们可以给阶乘提供以下签名:

factorial :: Int -> Even

factorial 的类型肯定比我们刚才说的返回 Int 更精确。但是您会发现用这样的类型定义 factorial 确实非常烦人,因为您需要一个乘法版本,将(偶数或奇数) IntEven 相乘并生成 Even 。此外,您可能必须在客户端代码中调用 toInteger 的结果上引入对 factorial 的无关调用,这可能是困惑和噪音的重要来源,但收效甚微。此外,所有这些转换函数都可能对性能产生负面影响。

另一个问题是,当引入新的、更精确的类型时,您通常最终不得不复制各种库函数。例如,如果您引入非空列表的类型 List1 a,那么您将必须重新实现 Data.List 已提供的许多功能,但仅限于 [a]。当然,我们可以将这些函数方法设为 ListLike 类型类。但你很快就会得到各种临时类型类和其他样板,同样没有太多收获。

最后一点是,不应将 Word 视为 Int 的无符号变体。 Haskell report 未指定 Int 的实际大小,并且仅保证该类型应该能够表示 [− 229, 229 − 1] 范围内的整数。据说类型 Word 提供未指定宽度的无符号整数。不保证在任何一致的实现中 Word 的宽度对应于 Int 的宽度。

尽管我提出了防止过度类型扩散的观点,但我确实承认引入自然数 Natural 的类型可能会很好。但归根结底,除了 IntInteger 和各种 Word* 类型之外,Haskell 是否应该有一个专用于自然数的类型,很大程度上取决于个人喜好。而目前的事态很可能在很大程度上只是历史的偶然。

关于haskell - Int vs Word 常用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12432154/

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