haskell - 为什么我不能用 Haskell 端口号中相同值的变量替换某个值?

标签 haskell ghci

这是展示该问题的 GHCI session :

Prelude> import Network
Prelude Network> PortNumber 1234
PortNumber 1234
Prelude Network> let n = 1234
Prelude Network> PortNumber n

<interactive>:5:12:
    Couldn't match expected type `PortNumber'
                with actual type `Integer'
    In the first argument of `PortNumber', namely `n'
    In the expression: PortNumber n
    In an equation for `it': it = PortNumber n

为什么这不起作用?给定一个存储在 Integer 中的变量(或 Word16,我正在读取用户输入,这样我就可以保持灵 active ),为什么我不能将其传递给 端口号

最佳答案

the source说:

newtype PortNumber = PortNum Word16 deriving (Eq, Ord, Typeable)
-- newtyped to prevent accidental use of sane-looking
-- port numbers that haven't actually been converted to
-- network-byte-order first.

换句话说,他们不希望您乱搞 PortNumber 内部结构。 (请注意,有 PortNumber 类型和 PortNumber 构造函数(类型为 PortID),这有点误导。)

如果您想在PortNumber(构造函数)中使用整型变量,则必须手动将其转换为PortNumber(类型)。幸运的是,它是 Num 的实例,因此支持 fromInteger:

Prelude Network> let n = 234
Prelude Network> PortNumber (fromInteger n)
PortNumber 234

当您使用整数文字时,编译器会自动添加 fromInteger 以使您的生活更轻松。

关于haskell - 为什么我不能用 Haskell 端口号中相同值的变量替换某个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18894440/

相关文章:

Haskell 嵌套向量并行策略

macos - 在 ghci 或 ghc 中使用 gcc 而不是 clang

c++ - 从 Haskell 调用 C++ 时无法运行 `stack ghci`

haskell - Haskell 中的手动类型推断

haskell - Yesod的Handler Monad是MonadBaseControl IO的实例吗?

haskell - 打印带有变量名称的 AST

haskell - 用parsec解析递归数据

haskell - 为什么ghci不使用相对路径?

haskell - 我如何在 GHCi 中抑制 "Failed, modules loaded:"?

haskell - 读取八进制数