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

Haskell列表模式匹配疑问:为何(x:xs)可行而[x:xs]不可行

Haskell列表模式匹配的核心区别

先明确两个模式的本质:

  • (x:xs) 是匹配任意非空列表
    Haskell里所有非空列表都是通过(:)(cons运算符)构造的——比如[1,2,3]本质是1 : (2 : (3 : []))。模式(x:xs)会把列表拆成首元素x和剩余元素组成的尾部xs(xs可以是空列表)。这个模式完全符合head :: [a] -> a的类型签名,因为它接收的就是普通非空列表,返回首元素a类型的值。

  • [x:xs] 是匹配「包含一个非空列表的单元素列表」
    模式里的方括号是列表字面量的语法糖,[x:xs]等价于(x:xs) : []——也就是一个嵌套列表,外层只有一个元素,而这个元素本身是个非空列表。比如它能匹配[[1,2,3]],但完全匹配不了普通的[1,2,3]。这就和head的类型签名冲突了:head声明接收[a],但这个模式要求参数是[[a]](嵌套列表),类型不匹配,所以代码无法通过编译。

举实际例子:

  • 第一个head函数传入[1,2,3],会匹配x=1、xs=[2,3],返回1,完全符合预期。
  • 第二个head函数只有传入[[4,5]]这种嵌套列表才有可能匹配,但此时参数类型是[[Int]],和声明的[a]不兼容,编译器直接报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:40:59