Haskell:具有多个条件的断点函数和作为条件的字符串

时间:2016-05-19 18:07:07

标签: haskell

我正在寻找打破字符串的功能(基于自己的条件,例如" ab"," c"," 3",&#34 ; 21")" abc321c"进入这个字符串(" ab"," c"," 3"," 21"," c")。

haskell中的break函数只接受一个条件(并且只接受char而不是字符串)并且只将它应用于列表中的第一个char。

*Main> break ('-'==) "teasd-das-d"
("teasd","-das-d")

2 个答案:

答案 0 :(得分:1)

你可以像这样明确地写出来:

break (\c -> (isUpper c || isDigit c)) ...

或者这样:

break (\c -> or $ map ($c) [isUpper, isDigit]) ...

这意味着如果你有这个辅助函数:

orF :: [a -> Bool] -> a -> Bool
orF fs a = or $ map ($a) fs

然后break电话变为:

break (orF [isUpper,isDigit, (=='-')]) ...

这里可能会使用一些类别理论运算符,但这是一种直接的方法。

<强>更新

如果你想获得幻想,你可以这样做:

import Control.Applicative

break (liftA2 (||) isUpper isDigit) ...

要将多个条件链接在一起,可能会定义一个运算符:

(|||) = liftA2 (||)

然后:

break (isUpper ||| isDigit ||| (=='-')) ...

答案 1 :(得分:0)

您可能正在regex-compat库中寻找splitRegex

import Text.Regex

> splitRegex (mkRegex "-") "eat-more-noodles"
["eat", "more", "noodles"]
> splitReges (mkRegex "(-|\\+)") "also+eat-barley"
["also", "eat", "barley"]

如您所见,正则表达式可以允许更丰富的分隔符......