Haskell类型混淆;无法匹配预期的类型,无论是/或关系
问题描述:
我有一些困难,找出为什么下面的代码不起作用。我期望,因为Command
数据类型是ServerCommand
或ClientCommand
任何类型的构造函数,预计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
这不会做你认为它。如果你想,可以存储无论是ServerCommand
或ClientCommand
,您可以使用库类型
type Command = Either ServerCommand ClientCommand
或创建自己的数据类型(提示:与data Bool = True | False
比较,考虑的差异。)
data Command = S ServerCommand | C ClientCommand
虽然我们在这,考虑沿
data ClientCommand = SEND String |
DISCONNECT |
CONNECT
线路重新设计你的数据
并完全放弃了Frame
。