gpt4 book ai didi

haskell - 实现解析器仿函数

转载 作者:行者123 更新时间:2023-12-03 12:24:33 26 4
gpt4 key购买 nike

为 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 Stringf为了得到 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 aM a -> M b获取 String -> M b :
instance Functor (Parser) where
fmap g (Parser f) = Parser $ fmap (first g) . f

你问是否可以从某个地方得到一个字符串。 Lambda 会为您做到这一点: \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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com