我想创建一个turtle模式,它相当于Regex中的“lookbefore”。从文档中看,它看起来可以工作,使用skip
模式,例如:match (skip "key:" <> chars) "key:value" -- "value"
个
但是我得到了一个类型错误
<interactive>:34:24: error:
• Couldn't match type ‘Text’ with ‘()’
Expected: Pattern ()
Actual: Pattern Text
• In the second argument of ‘(<>)’, namely ‘chars’
In the first argument of ‘match’, namely ‘(skip "key: " <> chars)’
In the expression: match (skip "key: " <> chars) "key:value"
字符串
我如何才能做到这一点,如果没有,是否有其他方法来实现所需的行为?
2条答案
按热度按时间k97glaaz1#
你可以先运行
skip
解析器,然后返回chars
的值,这样:字符串
ahy6op9u2#
<>
是错误的组合运算符用于这种情况。skip "key: "
是Pattern ()
。chars
是Pattern Text
。<>
来自Semigroup
类,我们可以看到<>
的类型为a -> a -> a
(对于带有Semigroup
示例的某个类型a
,Pattern
具有该示例);它结合了两个相同类型的东西。所以专门针对turtle的Pattern
类型,<>
运算符是Pattern a -> Pattern a -> Pattern a
1。您可以使用它来合并组合两个Pattern ()
值(得到一个Pattern ()
),或者你可以用它来合并两个Pattern Text
值(得到一个Pattern Text
)。它不知道如何组合两个 * 不同的 *Pattern
类型。更直观地思考(而不是查看类型),
<>
通过组合它们匹配的结果将两个模式组合成一个更大的模式(也是通过使用<>
运算符)。但这里您不想合并组合模式的结果,你想 * 忽略 *skip "key: "
模式的结果,让组合模式的结果只是chars
模式的结果。所以我们得出了同样的结论:<>
并不是一个你想做什么就做什么的运算符。Willem的回答建议使用
*>
运算符,它来自Applicative
,类型为f a -> f b -> f b
(对于带有Applicative
示例的某个类型构造函数f
,Pattern
具有该示例)。专门针对Pattern
的是Pattern a -> Pattern b -> Pattern b
;它结合了两个模式,但第一个模式的结果类型a
不会出现在最终的结果类型Pattern b
中。专门针对您的两个模式的类型,它最终将成为Pattern () -> Pattern Text -> Pattern Text
,这正是你需要的1只要为
a
选择的任何类型也是Semigroup
。