Haskell中使用重复参数定义模式同义词出现冲突定义问题
模式同义词定义编译错误原因解析
问题代码
pattern Double a = (a,a)
编译错误信息
error:
• Conflicting definitions for ‘a’
Bound at::1:21 :1:23
• In a pattern synonym declaration
中文翻译:
• 存在‘a’的冲突定义
绑定位置::1:21 :1:23
• 位于模式同义词声明中
错误原因
Haskell定义模式同义词时,左侧声明的变量和右侧模式里的绑定变量不能重名。你写的代码里,左边声明了a,右边元组里的两个a会被当作全新的绑定变量,和左边的a产生命名冲突,因此编译器报错。
正确写法
- 若只需要用该模式做匹配(单向模式),修改为:
pattern Double a <- (a,a)
- 若需要双向模式(既能匹配又能构造值),需启用对应扩展,写法如下:
{-# LANGUAGE PatternSynonyms, BidirectionalPatterns #-} pattern Double a = (a,a) <- (a,a)
或者用where子句形式(需启用PatternSynonyms):
{-# LANGUAGE PatternSynonyms #-} pattern Double a <- (a,a) where Double a = (a,a)
内容的提问来源于stack exchange,提问作者Futarimiti
相关产品推荐
相关产品推荐

