haskell “skip”与其他模式组合时出错

mpbci0fu  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(157)

我想创建一个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"

字符串
我如何才能做到这一点,如果没有,是否有其他方法来实现所需的行为?

k97glaaz

k97glaaz1#

你可以先运行skip解析器,然后返回chars的值,这样:

match (skip "key: " *> chars) "key:value"

字符串

ahy6op9u

ahy6op9u2#

<>是错误的组合运算符用于这种情况。
skip "key: "Pattern ()charsPattern Text
<>来自Semigroup类,我们可以看到<>的类型为a -> a -> a(对于带有Semigroup示例的某个类型aPattern具有该示例);它结合了两个相同类型的东西。所以专门针对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示例的某个类型构造函数fPattern具有该示例)。专门针对Pattern的是Pattern a -> Pattern b -> Pattern b;它结合了两个模式,但第一个模式的结果类型a不会出现在最终的结果类型Pattern b中。专门针对您的两个模式的类型,它最终将成为Pattern () -> Pattern Text -> Pattern Text,这正是你需要的
1只要为a选择的任何类型也是Semigroup

相关问题