【问题标题】:Understanding fmap with a monad用 monad 理解 fmap
【发布时间】:2019-08-06 09:52:22
【问题描述】:

我有以下数据类型:

newtype Rep f a = Rep { runRep :: String -> f (String, a) }

上述类型Rep f a 是一个有状态计算,它将String 作为初始状态,并产生一个(String, a) 作为计算结果。 f 是一个函子,计算的结果包含在函子中。

用于以下功能。

rep :: Functor f => Rep f a -> String -> f a
rep a s = fmap snd (runRep a s)

此函数可用于对字符串运行“Rep”计算。但是,我不确定为什么 runRep 必须将 Rep f aString 作为输入。 对于fmap snd (runRep a s) 行,我不确定元组的第二个元素是否会被包裹在函子中或没有它。

感谢任何见解。

【问题讨论】:

    标签: haskell functional-programming


    【解决方案1】:

    runRep 是您在记录中定义的内容:

    newtype Rep f a = Rep { <b>runRep</b> :: String -&gt; f (String, a) }

    编译器会自动为它构造一个名为runRep 的“getter”函数。这样的 getter 有签名:

    someGetter :: Record -&gt; TypeOfField

    对于你的runRep,是这样的:

    runRep :: Rep f a -&gt; (String -&gt; f (String, a))

    或者不那么冗长:

    runRep :: Rep f a -&gt; String -&gt; f (String, a)

    因此runRep 是一个确实接受Rep f a 的函数,并返回一个接受String 并返回f (String, a) 的函数。

    我不确定元组的第二个元素是否会被包裹在仿函数中返回。

    您将对f (String, a) 执行fmap sndfmap snd 已作为签名:

    fmap snd :: Functor f =&gt; f (a, b) -&gt; f b

    因此,您确实可以声明它将返回包装在仿函数中的数据的第二项。虽然“包装”在这里可能不是最好的词。

    请注意,如果 f ~ [],那么您映射到 2 元组列表,因此您将返回该列表中所有第二项的列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-24
      • 2012-03-14
      • 2018-03-26
      • 2021-07-28
      • 2018-05-06
      • 2018-05-05
      • 2016-02-26
      • 1970-01-01
      相关资源
      最近更新 更多