尝试使用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’
两条线。我已经导入了它,为什么它不在范围内?
答案 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} }。