Haskell类型混淆;无法匹配预期的类型,无论是/或关系

问题描述:

我有一些困难,找出为什么下面的代码不起作用。我期望,因为Command数据类型是ServerCommandClientCommand任何类型的构造函数,预计Command将能够接受一个或另一个。我似乎对这些数据类型应该如何排队有一个基本的误解。Haskell类型混淆;无法匹配预期的类型,无论是/或关系

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. 

data Command  = ServerCommand | ClientCommand 

这不会做你认为它。如果你想,可以存储无论是ServerCommandClientCommand,您可以使用库类型

type Command = Either ServerCommand ClientCommand 

或创建自己的数据类型(提示:与data Bool = True | False比较,考虑的差异。)

data Command = S ServerCommand | C ClientCommand 

虽然我们在这,考虑沿

data ClientCommand = SEND String | 
        DISCONNECT | 
        CONNECT 
线路重新设计你的数据

并完全放弃了Frame