在WinHugs中,我实现了以下功能:
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:l) = f x : map f l
这应该只为列表中的每个数字运行一个函数,如:
Hugs> map (+ 1) [1,2,3]
应该给出
[2,3,4].
但是当我尝试加载* .hs脚本时,WinHugs会给出错误消息
ERROR file:.\script.hs:3 - Ambiguous variable occurrence "map"
*** Could refer to: Main.map Hugs.Prelude.map
第3行是map f (x:l) = f x : map f l
我该如何避免这个问题?我想我的偏好/设置中的某些内容是错误的。
答案 0 :(得分:5)
您看到错误,因为Haskell Prelude已经定义了一个名为map
的函数。一个简单的修复方法是重命名您的定义,例如,
mymap :: (a -> b) -> [a] -> [b]
mymap f [] ...
更复杂的方法是使用
排除Prelude对map
的定义
import Prelude hiding (map)
位于模块顶部。
适应性方法是单独保留定义,并以其全名应用您想要的功能
Main.map (+ 1) [1, 2, 3]
或
Prelude.map (+ 1) [1, 2, 3]
答案 1 :(得分:1)
问题是您在范围内有两个map
函数,内置Prelude.map
和您在script.hs
中定义的函数。您可以直接将其称为
> Main.map (+1) [1, 2, 3]
或者您可以使用内置的map
,因为它的定义方式完全相同。
如果您想在范围内使用自定义Prelude.map
map
,可以
> Prelude.map (+1) [1, 2, 3]