【发布时间】:2013-02-15 15:30:03
【问题描述】:
我在 Haskell 中有一个handleReplace 函数,它的类型是
handleReplace :: Character -> T.Text -> T.Text
T 只是作为合格导入的 Data.Text 模块 所以这个函数接受一个字符类型,它的定义如下:
data Character = Character (String, String, String, String) [(String,String)] Case String Stringderiving (Read, Show)
和一个文本值。
它只关心字符串元组的列表,并尝试用 Data.Text 字符串中元组中的第二项替换元组中第一项的每次出现,以及该元组列表中的每个元素。一个例外是,如果要替换的匹配项位于以/ 开头的单词内。我这样定义函数:
handleReplace :: Character -> T.Text -> T.Text
handleReplace (Character _ [] _ _ _) s = s
handleReplace (Character _ ((a, b):xs) _ _ _) s = handleReplace emptyCharacter string
where emptyCharacter = Character ([], [], [], []) xs Normal [] []
string = T.unwords $ map (\ x
-> if (T.head x) == '/'
then x
else T.replace (T.pack a) (T.pack b) s
) $ T.words s
不幸的是,它不起作用。它不会抛出任何错误,但我没有得到预期的输出。 运行时
handleReplace (Character ([],[],[],[]) [("u","U"),("v","wv")] Normal [] []) $ T.pack "/uu v uu vvuu"
我希望它返回 "/uu wv UU wvwvUU"(显然是 Text 类型)但是当我在 ghci 中尝试时,我得到:
"/uu /UU /uu /UU wv UU wvwvUU /UU wv UU wvwvUU /UU wv UU wvwvUU ...
等等。 为什么?
【问题讨论】:
标签: haskell