gpt4 book ai didi

haskell - 如何在 Haskell 中创建具有空构造函数的数据类型的值?

转载 作者:行者123 更新时间:2023-12-02 17:55:03 24 4
gpt4 key购买 nike

Network 包中的 PortNumber 根本没有构造函数,其定义和文档如下(或请参阅 https://hackage.haskell.org/package/network-2.6.2.1/docs/Network.html ):

data PortNumber

Use the Num instance (i.e. use a literal) to create a PortNumber value with
the correct network-byte-ordering. You should not use the PortNum constructor.
It will be removed in the next release.

instances
...
Num PortNumber
...

让我困惑的是它如何使用 Num 实例来创建 PortNumber?我知道 PortNumber 是 Num 类的实例,可以将其视为 Num,但它如何才能将 Num 实例(例如文字 10000)视为端口号?当构造一个具有 PortNumber PortNumber 构造函数的 PortID 时,仅使用 PortNumber 10000 似乎就可以了。这是怎么发生的?

最佳答案

如果你看source你会看到这个:

newtype PortNumber = PortNum Word16 deriving (Eq, Ord, Typeable)

现在。

如果您查看文档,您也会看到此警告:

DEPRECATED PortNum "Do not use the PortNum constructor. Use the Num instance. PortNum will be removed in the next release."

这里的意思是PortNumberinstance of Num所以你可以使用 fromInteger - 当 Haskell 看到像 1, 20, ... 这样的整数时,Haskell 默认会这样做 - 即还有为什么

Prelude> :t 666
666 :: Num a => a

因此,您可以使用 10000 而不是使用构造函数 PortNum 10000,它将是一个 PortNumber自动在正确的上下文中(见下文)

<小时/>

对于 PortId 部分:PortNumber 有一个 PortId 的构造函数 ( see source :

data PortID =
Service String
| PortNumber PortNumber
| UnixSocket String

) - 所以如果您使用 PortNumber 10000 您现在确实使用 Int -> PortNumber -> PortId 路径作为 10000 (使用 fromInteger)转换为 PortNumber,然后插入构造函数 PortNumber 以获取 端口ID

<小时/>

除此之外,您可能会看到带有数据定义的示例 - 但由于 Haskell 很懒,您通常仍然可以使用 undefined::MyEmptyType 来获取 无论如何都不会被评估的地方的值(value)。

Fun with type functions中有一个很好的例子正是使用这个:

data Zero
data Succ n

class Nat n where
toInt :: n -> Int

instance Nat Zero where
toInt _ = 0

instance (Nat n) => Nat (Succ n) where
toInt _ = 1 + toInt (undefined :: n)

关于haskell - 如何在 Haskell 中创建具有空构造函数的数据类型的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32497671/

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