gpt4 book ai didi

Haskell 类型混淆;尽管有非此即彼的关系,但仍无法匹配预期的类型

转载 作者:行者123 更新时间:2023-12-01 09:15:18 27 4
gpt4 key购买 nike

我在弄清楚为什么下面的代码不起作用时遇到了一些麻烦。我希望由于 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.

最佳答案

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 东西。

关于Haskell 类型混淆;尽管有非此即彼的关系,但仍无法匹配预期的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46256367/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com