【问题标题】:Haskell generalization of map function for functor函子映射函数的 Haskell 泛化
【发布时间】:2020-11-28 00:21:18
【问题描述】:

mapFunctor :: Functor f => (a -> b) -> [f a] -> [f b]

这个函数应该是map的概括。它与map 函数的工作方式相同,并且适用于任何Functor,而不仅仅是Maybe

我被困住了。任何提示都会有所帮助!谢谢。

【问题讨论】:

  • 提示:看看fmap
  • 提示:把类型签名想象成(a -> b) -> ([f a] -> [f b])——即给定一个函数a -> b,你如何得到一个新函数[f a] -> [f b]?如果看不懂怎么做,能不能先弄个函数f a -> f b?如果是这样,你能看到如何从它变成你想要的类型吗?
  • 当我使用 fmap 时,出现错误信息,期望类型:[f b],实际类型 [b]
  • @Jacky: 是的,你不能直接使用fmap,以后它会查看外部类型构造函数,参见[] 并专门化f ~ []。你需要以某种方式组合fmapmap
  • 要记住的另一件有用的事情是[x][] x 的语法糖,例如[f a] = [] (f a)[[a]] = [] ([] a)

标签: list haskell functor map-function


【解决方案1】:

types拼图游戏/连接电线(无论你喜欢哪个比喻):

mapFunctor :: Functor f 
           => (a -> b) -> [f a] -> [f b]
mapFunctor    f           []     = []
mapFunctor    f           (x:xs) = (y:ys)
  where
  --        (x:xs) :: [f a]
  --           xs  :: [f a]
  --         x     ::  f a
  --       f       ::    a  ->    b
  --  fmap f       ::  f a  ->  f b
  --  fmap f x     ::           f b 
  --        (y:ys) ::          [f b]
  --         y     ::           f b 
  --           ys  ::          [f b]
  -- mapFunctor f  :: [f a] -> [f b]
  -- mapFunctor f xs        :: [f b]
  y  =  ....
  ys =  .....

当您了解更多信息时,您会发现 [] 类型也是一个 Functor,因此您的函数就是 fmap . fmap。但这会在以后发生。

【讨论】:

    【解决方案2】:

    这只是mapfmap 的组合。 fmap :: Functor f => (a -> b) -> f a -> f b 是一个函数,它为作为Functor typeclass 实例的每种类型执行映射,map :: (c -> d) -> [c] -> [d] 用于创建一个函数,该函数包含将函数应用于每个项目的结果。

    我把它作为一个练习把两者结合成一个函数mapFunctor

    mapFunctor :: Functor f => (a -> b) -> [f a] -> [f b]
    mapFunctor = …

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多