2

この問題を示す GHCI セッションは次のとおりです。

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ユーザー入力を読み取っているので、柔軟に対応できます)、それを に渡すことができないのはなぜPortNumberですか?

4

2 に答える 2

9

ソースが言うように:

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( -type とPortNumber-constructor ( type の)があることに注意してくださいPortID。これは少し誤解を招きます。)

(コンストラクター) で整数変数を使用する場合は、手動で (型)PortNumberに変換する必要があります。PortNumber幸いなことに、これは のインスタンスであるNumため、以下をサポートしますfromInteger

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

整数リテラルを使用するとfromInteger、コンパイラによって自動的に追加され、作業が楽になります。

于 2013-09-19T12:35:05.217 に答える