Haskell中‘product’标识符歧义错误的排查与解决咨询
解决Haskell中
product标识符歧义问题 问题原因
Haskell默认会导入Prelude标准模块,其中已经定义了一个product函数(用于计算可折叠容器中元素的乘积,类型为Foldable t => t a -> a)。你自己定义的阶乘函数也使用了product作为名称,导致编译器无法区分引用的是哪个product,从而抛出歧义错误。
解决方案
方案1:重命名自定义函数
最直接的方式是把自己的阶乘函数改名,比如改为factorial,彻底避免名称冲突:
factorial :: (Eq p, Num p) => p -> p factorial 1 = 1 factorial n = n * factorial (n-1) main = print (factorial 8)
方案2:隐藏Prelude中的product
在代码开头添加导入声明,隐藏Prelude里的product,这样编译器就只会识别你自定义的product:
import Prelude hiding (product) product :: (Eq p, Num p) => p -> p product 1 = 1 product n = n * product (n-1) main = print (product 8)
方案3:使用限定引用
如果不想改名也不想隐藏,可以在调用时明确指定是自己定义的product(通过模块名限定),不过这种方式稍显繁琐:
product :: (Eq p, Num p) => p -> p product 1 = 1 product n = n * Main.product (n-1) main = print (Main.product 8)
内容的提问来源于stack exchange,提问作者Alix Blaine
相关产品推荐
相关产品推荐

