Haskell中直接匹配字符串'hello'的函数为何无法运行?
问题解答
你的代码无法运行的核心原因是Haskell对单引号和双引号的语义有严格区分:
- 单引号
'仅用于表示单个字符(比如习题3里的'a'),'hello'这种写法属于语法错误——编译器会认为你试图把多个字符塞进单个字符的定义中,这不符合Haskell的语法规则。 - 字符串在Haskell里本质是字符列表
[Char],必须用双引号"hello"来表示,或者用列表构造符:拼接单个字符的形式。
正确写法1:直接匹配字符串
把单引号替换为双引号即可正常运行,用通配符_匹配所有其他字符串会更简洁:
f :: [Char] -> Bool f "hello" = True f _ = False
正确写法2:使用题目要求的列表字符模式
按照习题里提到的“列表模式指定每个字符”,可以将字符串拆分为字符链表的形式进行匹配,这也是Haskell列表模式匹配的标准用法:
f :: [Char] -> Bool f ('h':'e':'l':'l':'o':[]) = True f _ = False
这里'h':'e':'l':'l':'o':[]和"hello"是完全等价的,因为字符串就是字符的链表结构,:是链表的构造运算符,[]代表空链表。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

