查找并 return 第一个包含 char (Haskell) 的字符串
Find and return first string which contains char (Haskell)
我正在尝试编写一个循环遍历字符串列表的函数,如下所示:
[" | "," # "," * "," | "," # "]
我正在尝试查找 return 第一个包含 '|', '#', or '*'
的元素,具体取决于用户的选择。
我想到了这个解决方案:
test :: Char -> [String] -> Maybe Char
test c (x:xs) = find (== c) $ concatMap (filter (/=' ')) (reverse xs)
我得到这个输出:
ghci> test '*' [" | "," # "," * "," | "," # "]
Just '*'
它找到了元素,但我希望它 return 元素而不改变它(删除空格)。如何在不过滤掉空格的情况下执行此操作?
这是我想要的输出:
ghci> test '*' [" | "," # "," * "," | "," # "]
" * "
由于您已使用 list-comprehension 标记您的问题,
test :: Eq a => a -> [[a]] -> Maybe [a]
test c xs = listToMaybe [s | s <- xs, elem c s]
应该完成这项工作。
> test '*' [" | "," # "," * "," | "," # "]
Just " * "
> test '-' [" | "," # "," * "," | "," # "]
Nothing
> :i listToMaybe
listToMaybe :: [a] -> Maybe a -- Defined in `Data.Maybe'
我正在尝试编写一个循环遍历字符串列表的函数,如下所示:
[" | "," # "," * "," | "," # "]
我正在尝试查找 return 第一个包含 '|', '#', or '*'
的元素,具体取决于用户的选择。
我想到了这个解决方案:
test :: Char -> [String] -> Maybe Char
test c (x:xs) = find (== c) $ concatMap (filter (/=' ')) (reverse xs)
我得到这个输出:
ghci> test '*' [" | "," # "," * "," | "," # "]
Just '*'
它找到了元素,但我希望它 return 元素而不改变它(删除空格)。如何在不过滤掉空格的情况下执行此操作?
这是我想要的输出:
ghci> test '*' [" | "," # "," * "," | "," # "]
" * "
由于您已使用 list-comprehension 标记您的问题,
test :: Eq a => a -> [[a]] -> Maybe [a]
test c xs = listToMaybe [s | s <- xs, elem c s]
应该完成这项工作。
> test '*' [" | "," # "," * "," | "," # "]
Just " * "
> test '-' [" | "," # "," * "," | "," # "]
Nothing
> :i listToMaybe
listToMaybe :: [a] -> Maybe a -- Defined in `Data.Maybe'