作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为 Brent Yorgey 的 2013 年宾夕法尼亚大学工作 class作业,以下newtype
存在:newtype Parser a = Parser { runParser :: String -> Maybe (a, String) }
我正在尝试实现 Parser
作为 Functor
.
鉴于以下 first
帮助解决这个问题的函数:
first :: (a -> b) -> (a, c) -> (b, c)
first f (a, c) = (f a, c)
instance Functor (Parser) where
fmap g (Parser f) = Parser $ fmap (first g) (f . g)
f
的类型是
String -> Maybe (a, String)
.所以,我不知道如何
apply
String
至
f
为了得到
Maybe (a, String)
.
Maybe (a, String)
,我相信我可以简单地运行
fmap (first g) ...
哪里
...
代表
Maybe
.
Maybe (a, String)
.
f
欠了
String
给出
Maybe (a, String)
的类型,我不知道在哪里可以找到
String
争论。
最佳答案
你做得很好。
如果我只是做一个类型同义词,它可能会更清楚
type M a = Maybe (a,String)
fmap (first g) :: Maybe (a, String) -> Maybe (b,String)
-- :: M a -> M b
f :: String -> Maybe (a,String)
-- String -> M a
String -> M a
与
M a -> M b
获取
String -> M b
:
instance Functor (Parser) where
fmap g (Parser f) = Parser $ fmap (first g) . f
\xs ->
可以读作“给我一个字符串
xs
...”,你可以申请
f
到该字符串以获取类型
Maybe (a,String)
的内容.所以你也可以写:
instance Functor (Parser) where
fmap g (Parser f) = Parser $ \xs -> fmap (first g) (f xs)
关于haskell - 实现解析器仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27673320/
我是一名优秀的程序员,十分优秀!