Haskell replicate'函数传负数报错,书本示例也失效?
Haskell replicate' 函数负数参数触发类型歧义的原因
核心问题:表达式解析优先级冲突
你遇到的类型歧义错误和函数实现无关,本质是GHC对Haskell表达式的解析规则导致的:函数应用的优先级高于前缀负号(-)。
当你输入replicate' -1 42时,GHC会将其解析为:
(replicate' (-)) 1 42
也就是把负号运算符-作为第一个参数传给replicate',再依次传入1和42。这种调用方式完全不符合函数的参数预期,因此触发了复杂的类型歧义错误。
解决方法:给负数参数加括号
要让GHC正确识别负数为单个参数,必须给负数加上括号,正确的调用写法是:
ghci> replicate' (-1) 42 []
此时无论是你自己的实现(注意代码里的笔误:replicae'应为replicate'),还是书中的示例代码,都能正常返回空列表。
补充:你的实现中的笔误修正
你写的代码里存在一个拼写错误,第一行模式匹配的函数名多了一个字母e,修正后的完整代码如下:
replicate' :: (Num a, Ord a) => a -> b -> [b] replicate' 0 _ = [] replicate' n x | n < 0 = [] | n > 0 = [x] ++ replicate' (n - 1) x
内容的提问来源于stack exchange,提问作者peroksid
相关产品推荐
相关产品推荐

