Haskell式混淆; 尽管有任何关系,但无法匹配预期的类型

wic*_*her 3 haskell types typeclass

我在查明以下代码无效的原因时遇到了一些麻烦.我希望,因为Command数据类型是一个ServerCommandClientCommand任何类型的构造函数,期望一个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!"))
Run Code Online (Sandbox Code Playgroud)

当我尝试将此代码加载到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.
Run Code Online (Sandbox Code Playgroud)

n. *_* m. 8

data Command        =   ServerCommand | ClientCommand
Run Code Online (Sandbox Code Playgroud)

这不符合你的想法.(提示:比较data Bool = True | False,考虑差异.)

如果需要可以存储a ServerCommand或a 的数据类型,则ClientCommand可以使用库类型

type Command = Either ServerCommand ClientCommand
Run Code Online (Sandbox Code Playgroud)

或创建自己的

data Command = S ServerCommand | C ClientCommand
Run Code Online (Sandbox Code Playgroud)

虽然我们正在努力,但请考虑重新设计您的数据

data ClientCommand = SEND String |
                     DISCONNECT |
                     CONNECT
Run Code Online (Sandbox Code Playgroud)

并放弃了这Frame件事.