WinHugs / Haskell中出现模糊的“map”错误

时间:2014-01-09 19:02:55

标签: haskell

在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

我该如何避免这个问题?我想我的偏好/设置中的某些内容是错误的。

2 个答案:

答案 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]