Text.Regex.Applicative - 多行注释
Text.Regex.Applicative - Multiline Comments
我想不出使用 Haskell regex-applicative
包对使用 replace
函数的多行注释执行替换的正确方法。首先,我试图让 match
到 return 正确的字符串作为测试:
regex = pure (++) <$> string "/*" <*> many (anySym) <*> string "*/"
match regex "/* hello world */"
returnhello world */
。我不明白为什么第一个匹配部分被切断了。有什么想法吗?
你混淆了应用习语。要么
f <$> x <*> y <*> z
^^^
或
pure f <*> x <*> y <*> z
^^^
您选择的组合
pure f <$> x <*> y <*> z
具有误导性。因为
(<$>) :: (Functor f) => (a -> b) -> f a -> f b
将一个函数作为其左参数,pure f
在 (->) r
应用程序中被解释,其中 pure = const
。所以你得到
const (++) <$> string "/*" <*> many anySym <*> string "/*"
现在我们有望看到第一个字符串被忽略的原因。
您不能将 (++)
应用于三个参数,这就是其他形式无法编译的原因。我认为你真正需要的是
sequenceA :: (Applicative f) => [f a] -> f [a]
将解析器列表* 转换为给出列表的解析器,然后 concat
结果。
regex = concat <$> sequenceA [string "/*", many anySym, string "*/"]
*实际上 sequenceA
更通用,具有类型 (Applicative f, Traversable t) => t (f a) -> f (t a)
,但我不想在这个答案中走得太远.
我想不出使用 Haskell regex-applicative
包对使用 replace
函数的多行注释执行替换的正确方法。首先,我试图让 match
到 return 正确的字符串作为测试:
regex = pure (++) <$> string "/*" <*> many (anySym) <*> string "*/"
match regex "/* hello world */"
returnhello world */
。我不明白为什么第一个匹配部分被切断了。有什么想法吗?
你混淆了应用习语。要么
f <$> x <*> y <*> z
^^^
或
pure f <*> x <*> y <*> z
^^^
您选择的组合
pure f <$> x <*> y <*> z
具有误导性。因为
(<$>) :: (Functor f) => (a -> b) -> f a -> f b
将一个函数作为其左参数,pure f
在 (->) r
应用程序中被解释,其中 pure = const
。所以你得到
const (++) <$> string "/*" <*> many anySym <*> string "/*"
现在我们有望看到第一个字符串被忽略的原因。
您不能将 (++)
应用于三个参数,这就是其他形式无法编译的原因。我认为你真正需要的是
sequenceA :: (Applicative f) => [f a] -> f [a]
将解析器列表* 转换为给出列表的解析器,然后 concat
结果。
regex = concat <$> sequenceA [string "/*", many anySym, string "*/"]
*实际上 sequenceA
更通用,具有类型 (Applicative f, Traversable t) => t (f a) -> f (t a)
,但我不想在这个答案中走得太远.