导入Prelude功能,doctest说'不在范围内'

时间:2014-09-27 14:07:14

标签: haskell

尝试使用Prelude的内置函数来按空格分隔符来设置字符串,如SO answer here所述。

我有以下内容:

module MiniForth
  ( functions
  , ...
  ) where
import Data.Char  -- I actually import here
import Prelude hiding (words) -- this avoids the ambiguity in the words function when declaring it locally

words :: String -> [String]
-- ^ Takes a string and breaks it into separate words delimited by a space
--
--   Examples:
--
--   >> words "break this string at spaces"
--   ["break","this","string","at","spaces"]
--
--   >> words ""
--   []
--
words s =  case dropWhile Char.isSpace s of
                      "" -> []
                      s' -> w : words s''
                            where (w, s'') = break Char.isSpace s'

但运行Doctest时仍然出现错误:

Not in scope: ‘Char.isSpace’ 

两条线。我已经导入了它,为什么它不在范围内?

2 个答案:

答案 0 :(得分:3)

该行

import Data.Char

isSpace放入范围,不带Char.前缀。因此,删除所述前缀就足够了。

否则,

import qualified Data.Char as Foo

Foo.isSpace放入范围(以及导入模块的其余部分),使用您选择的任何前缀Foo.

答案 1 :(得分:2)

您已经有了很好的建议,但作为进一步的解释,这里可能发生的事情是您尝试改编的代码使用了Data.Char模块的 Haskell98名称,这只是Char。 (如果启用GHC的Haskell98模式,您仍然可以以这种方式导入它。)

在H98标准之后添加了带有点的分层模块名称,这是人们看到完全平坦的模块命名空间不切实际时的事后想法。但这是以最小的方式完成的,只需在模块名称中添加.作为允许的字符。

特别是,模块名称在Haskell中不是 divisible :导入模块名称Data.Char本身并不能让您使用Char作为模块前缀。

因此,如果 想要在isSpace之后import Data.Char之前包含模块前缀,则必须使用完整的模块名称:{{1} }。