2014-09-27 36 views
1

试图使用Prelude的内置函数来通过空格分隔符来判定一个字符串,如SO回答here所述。导入前奏功能,doctest说'不在范围内'

我有以下几点:

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' 

但运行文档测试时,我仍然得到错误:

​​

两条线路。我输入了它,为什么它不在范围内?

+1

尝试删除'isSpace'前面的'Char.'。或'将合格的Data.Char导入为Char'。 – chi 2014-09-27 14:36:15

+1

把它当作答案扔进去,而且生病了:) – 2014-09-27 14:58:58

回答

3

线

import Data.Char 

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

否则,

import qualified Data.Char as Foo 

会把Foo.isSpace到范围(以及导入的模块的其余部分),用你选择的任何前缀Foo.

2

你已经取得了很好的建议,但作为进一步的解释,大概什么这里发生的是,你试图代码,以适应使用的Data.Char模块,这只是Char Haskell98名。 (您仍然可以导入这种方式,如果您启用GHC的Haskell98模式。)

分层模块名称与他们点中加入H98标准经过一段时间,在事后,当人们看到一个完全平坦的模块命名空间是不切实际的。但是,这是以最简单的方式完成的,只需将.作为模块名称中允许的字符添加即可。

特别是模块名称不整除哈斯克尔:导入模块名Data.Char本身不给你使用Char作为一个模块前缀的任何访问。

所以,如果你没有要包括isSpace前一个模块前缀正是这样做import Data.Char后,就必须与完整的模块名称:Data.Char.isSpace