将函数转换为 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>"
做完后
>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>"