将函数转换为 1 个衬里

Convert function into 1 liner

做完后

>import Text.ParserCombinators.Parsec

>data Tag = MkTag String deriving Show 

我有这个功能

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

我想将它转换为 ghci 的 1 衬垫。我本可以使用 :{ ... :} 但想了解为什么它不起作用。这是第 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

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

您可以用 (<$) :: Functor f => a -> f b -> f a 来定义它。因此,这执行了具有 x <$ u = fmap (const x) u:

的函子映射
{-# LANGUAGE <b>FlexibleContexts</b> #-}

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