在WinHugs中,我实现了以下功能:
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:l) = f x : map f l
Run Code Online (Sandbox Code Playgroud)
这应该只为列表中的每个数字运行一个函数,如:
Hugs> map (+ 1) [1,2,3]
Run Code Online (Sandbox Code Playgroud)
应该给
[2,3,4].
Run Code Online (Sandbox Code Playgroud)
但是当我尝试加载*.hs脚本时,WinHugs会给出错误消息
ERROR file:.\script.hs:3 - Ambiguous variable occurrence "map"
*** Could refer to: Main.map Hugs.Prelude.map
Run Code Online (Sandbox Code Playgroud)
第3行是 map f (x:l) = f x : map f l
我该如何避免这个问题?我想我的偏好/设置中的某些内容是错误的.
您看到错误,因为Haskell Prelude已经定义了一个名为的函数map.一个简单的修复方法是重命名您的定义,例如,
mymap :: (a -> b) -> [a] -> [b]
mymap f [] ...
Run Code Online (Sandbox Code Playgroud)
更复杂的方法是排除Prelude对mapwith 的定义
import Prelude hiding (map)
Run Code Online (Sandbox Code Playgroud)
在您的模块的顶部.
适应性方法是单独保留定义,并以其全名应用您想要的功能
Main.map (+ 1) [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
要么
Prelude.map (+ 1) [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)