微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Haskell:理解函子

如何解决Haskell:理解函子

我正在做一个关于 applicative Functor 的 Haskell 教程: CIS194: Homework10 - applicative

在教程中,给出了以下解析器:

-- A parser for a value of type a is a function which takes a String
-- representing the input to be parsed,and succeeds or fails; if it
-- succeeds,it returns the parsed value along with the remainder of
-- the input.
newtype Parser a = Parser { runParser :: String -> Maybe (a,String) }

在练习 2 中,我们被要求为 Parser 实现一个 applicative 实例。
在实现 applicative 之前,我们需要实现 Functor。
我的函子解析器实现是:

instance Functor Parser where
  fmap f p = Parser ( -- take a function and a parser
    \s0 -> case runParser p s0 of -- parse a string
        nothing -> nothing -- if parse fails,returns nothing
        Just (a,s1) -> Just (f a,s1) -- if parse succeed,returns
                                      --1. 1st function applied to parsed result
                                      --2. remaining string
    )

但是我找到了另一种实现这个 Functor 的方法 bschwb /cis194-solutions
函子解析器的实现是:

first :: (a -> b) -> (a,c) -> (b,c)
first f (a,c) = (f a,c)

instance Functor Parser where
  fmap f (Parser rp) = Parser (fmap (first f) . rp)

我不明白'. rp'部分,你能帮帮我吗?
据我了解:

  • 解析器 rp : 'rp' 可以是任何东西(整数、元组函数...),我们不应该知道它是什么;
  • '.'运算符仅适用于函数
  • 所以我们不能混合'.'和 'rp' 因为我们不确定 'rp' 将是一个函数。 我错过或误解了什么?

感谢您的帮助。

解决方法

newtype Parser a = Parser { runParser :: String -> Maybe (a,String) } 中,我专注于数据类型 Parser a,而不是构造函数 Parser :: (String -> Maybe (a,String)) -> Parser a

现在很清楚了:

instance Functor Parser where
    fmap -- Functor f => (a->b) -> f a -> f b
      func -- a -> b
      (Parser rp) -- regarding Parser constructor rp :: String -> Maybe (a,String)
     = Parser
      (
        fmap (first func) -- we can deduce : fmap (first func) :: Functor f => f (a,c) -> f (func a,c)
        . -- and we know : (.) :: (b -> c) -> (a -> b) -> (a -> c)
        rp -- rp :: String -> Maybe (a,String)
      ) -- therefore : fmap (first func).rp :: String -> Maybe (func a,String)

感谢 duplode 的评论。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。