这是展示该问题的 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/