【发布时间】:2019-06-22 13:48:12
【问题描述】:
我有以下代码:
{-
Returns a list of Strings splitted by ' '. '\\ ' is kept as ' '
-}
splitOnWhitespace :: String -> [String]
splitOnWhitespace s = concatOnBackslash $ splitOn " " s
{-
concats Strings on '\\' with a whitespace
-}
270 concatOnBackslash :: [String] -> [String]
271 concatOnBackslash [] = []
273 concatOnBackslash [x] = [x]
274 concatOnBackslash [x, xs] = case last x of
275 '\\' -> [(init x) ++ " " ++ xs]
276 _ -> [x, xs]
277 concatBackslash (x : xx : xs) = case last x of
278 '\\' -> concatOnBackslash (((init x) ++ " " ++ xx) : xs)
279 _ -> x: concatOnBackslash (xx : xs)
编译后应该返回一个字符串列表,该字符串在非转义空格处拆分。
但是会发生以下情况:
*Filesystem> splitOnWhitespace "a1"
["a1"]
*Filesystem> splitOnWhitespace "a1 a2"
["a1","a2"]
*Filesystem> splitOnWhitespace "a1 a2 a3"
*** Exception: src/Filesystem.hs:(271,1)-(275,24): Non-exhaustive patterns in function concatOnBackslash
*Filesystem> splitOnWhitespace "a1 a2 a3 a4"
*** Exception: src/Filesystem.hs:(271,1)-(275,24): Non-exhaustive patterns in function concatOnBackslash
我在这里做错了什么?
【问题讨论】:
-
last x是一个非total函数,在非空列表上会出错。 -
最后一个子句的名称 (
concatBackslash) 也不同于上面的子句名称 (concatOnBackslash)。 -
启用警告指出最后一行的拼写错误,因为那将是一个没有类型签名的函数。
-
感谢您的提示 :)