2017-09-16 5 views
3

以下のコードが機能しない理由を理解するのに何らかの問題があります。 Commandのデータ型は、ServerCommandまたはClientCommandのいずれかであるため、Commandを受け取ることになっている任意の型のコンストラクタは、どちらか一方を受け入れることができます。私は、これらのデータ型がどのように並んでいるかについて基本的な誤解を持っているようです。ハスケル型混乱。 /または関係にもかかわらず予想されるタイプと一致しませんでした

data ClientCommand = SEND | 
         DISCONNECT | 
         CONNECT 

data ServerCommand = CONNECTED | 
         MESSAGE | 
         RECEIPT | 
         ERROR 

data Command  = ServerCommand | ClientCommand 

type Frame   = (Command, Maybe String) 

makeConnect :: Frame 
makeConnect = (CONNECT, (Just "hello!")) 

私はGHCiのにこのコードをロードしようとすると、私は次のエラーを取得する:

GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help 
[1 of 1] Compiling Main    (Frames.hs, interpreted) 

Frames.hs:15:16: 

    Couldn't match expected type ‘Command’ 
       with actual type ‘ClientCommand’ 
    In the expression: CONNECT 
    In the expression: (CONNECT, (Just "hello!")) 
Failed, modules loaded: none. 

答えて

8
data Command  = ServerCommand | ClientCommand 

これは、あなたはそれがないと思う何をしません。 (ヒント:。違いを考え、data Bool = True | Falseと比較して)

あなたがServerCommandClientCommandのいずれかを格納できるデータ型が必要な場合は、ライブラリの種類

type Command = Either ServerCommand ClientCommand 

または

独自に作成を使用することができます
data Command = S ServerCommand | C ClientCommand 

我々はそれに取り組んでいる一方で、

data ClientCommand = SEND String | 
        DISCONNECT | 
        CONNECT 
の線に沿って、あなたのデータを再設計を検討

となり、Frameは完全に削除されます。

関連する問題