【问题标题】:Convert function into 1 liner将函数转换为 1 行
【发布时间】:2021-05-12 12:48:12
【问题描述】:

做完之后

>import Text.ParserCombinators.Parsec

>data Tag = MkTag String deriving Show 

我有这个功能

parseDiv = do 
  string "<div>" 
  return (MkTag "div")

我想将它转换为 ghci 的 1 班轮。我本可以使用 :{ ... :} 但想了解它为什么不起作用。这是第一行

>let parseDiv  = do { string "<div>";return $ MkTag "div" }


<interactive>:7:5: error:
* Non type-variable argument
    in the constraint: Text.Parsec.Prim.Stream s m Char
  (Use FlexibleContexts to permit this)
* When checking the inferred type
    parseDiv :: forall s (m :: * -> *) u.
                Text.Parsec.Prim.Stream s m Char =>
                Text.Parsec.Prim.ParsecT s u m Tag

如果我在多行中定义它,它会起作用。

【问题讨论】:

  • 如错误所说,您需要启用FlexibleContexts 语言编译指示,将其限制为Stream s m Char
  • 谢谢,不幸的是,我在 ghci 中添加了 {-# LANGUAGE FlexibleContexts #-} 并尝试再次执行 1 行,但得到了相同的结果。
  • 您不能在ghci 中写入,对于ghci,您可以使用:set -XFlexibleContexts 设置它。编译指示适用于 Haskell file.

标签: haskell parsec


【解决方案1】:

您可以使用(&lt;$) :: Functor f =&gt; a -&gt; f b -&gt; f a 定义它。因此,这将执行与x &lt;$ u = fmap (const x) u 的函子映射:

{-# LANGUAGE FlexibleContexts #-}

parseDiv :: Stream s m Char => ParsecT s u m Tag
parseDiv = MkTag "div" <$ string "<div>"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多