You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用代数数据类型构造Chain链的正确性咨询

你的Chain构造问题解答

首先看你定义的Haskell数据类型:

data Link = G | S | P deriving (Eq, Show)
data Chain = Empty | Join Chain Link Chain

Join Chain Link Chain的语义是把一个Link拼接在两个Chain中间,整个Chain的元素顺序是:左边Chain的所有元素 → 当前Link → 右边Chain的所有元素。

你当前写的构造代码:

chain1 = (Join Empty G (Join Empty G (Join Empty P (Empty))))

实际生成的链元素顺序是 G → G → P,和你想要的「Platinum、Gold、Gold」(即P → G → G)完全相反——因为你把最想要的第一个元素P放在了最内层的Join里,而外层的Join会把自己的Link放在更靠前的位置。

正确的构造方式

要得到P → G → G的链,需要把P放在最左侧的拼接位置,依次向右添加G:

-- 直接一行构造
chain1 = Join (Join (Join Empty P Empty) G Empty) G Empty

如果你觉得嵌套写法不够直观,可以分步构建:

-- 先创建仅含P的链
onlyP = Join Empty P Empty
-- 给onlyP拼接一个G,得到P→G的链
pThenG = Join onlyP G Empty
-- 再给pThenG拼接一个G,得到P→G→G的链
chain1 = Join pThenG G Empty

验证方法

你可以写一个辅助函数把Chain转换成列表,直观查看元素顺序:

chainToList :: Chain -> [Link]
chainToList Empty = []
chainToList (Join left link right) = chainToList left ++ [link] ++ chainToList right

调用chainToList chain1,如果返回[P, G, G],就说明构造正确。

内容的提问来源于stack exchange,提问作者Daniel12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:05:27