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

时间:2017-09-16 17:05:51

标签: 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!"))

当我尝试将此代码加载到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.

1 个答案:

答案 0 :(得分: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