我在查明以下代码无效的原因时遇到了一些麻烦。我希望由于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.
答案 0 :(得分:8)
data Command = ServerCommand | ClientCommand
这不符合你的想法。 (提示:与data Bool = True | False
比较,考虑差异。)
如果您想要一种可以存储ServerCommand
或ClientCommand
的数据类型,则可以使用库类型
type Command = Either ServerCommand ClientCommand
或创建自己的
data Command = S ServerCommand | C ClientCommand
虽然我们正在考虑,但请考虑按照
的方式重新设计数据data ClientCommand = SEND String |
DISCONNECT |
CONNECT
完全放弃了Frame
。