gpt4 book ai didi

haskell - Haskell中如何用fmap表达return?

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

所以我发现fmap,一个Functor函数可以用一元运算符>>=return来表达 函数如下:

fmap' :: (Monad m) => (a -> b) -> m a -> m b
fmap' g x = x >>= (\y ->
return (g y))

所以我的第一个问题是我们如何实现基于fmap的返回函数?

如果我们可以基于fmap实现返回函数,我们是否可以减少do block 中的Haskell表达式?这会产生更优雅的代码吗?

例如:

Just x -> do 
y <- f x
return (a:y)

最佳答案

我们一般不能用fmap来实现returnMonad 只是比 Functor 更强大。

但是,作为练习,我们可以尝试问这个问题:哪种第二个操作(如果有)可以依次实现 returnfmap?我们可以通过查看类型来解决这个问题。 (我们将使用 Applicative 类中的 pure 而不是 return - 它们基本上是相同的操作。)

fmap :: Functor f => (a -> b) -> f a -> f b
pure :: Applicative f => a -> f a

好吧,一种可能的方法是我们有以下函数:

-- This is like the standard `const` function, but restricted to the `()` type:
const' :: a -> () -> a
const' a = \() -> a

然后我们可以这样写,“几乎”是纯粹的/return:

almostThere :: Functor f => a -> f () -> f a
almostThere a = fmap (const' a)

然后,如果我们有以下类,我们可以用它来编写pure:

class Functor f => Pointed f where
unit :: f ()

pure :: Pointed f => a -> f a
pure a = almostThere a unit

长话短说,归结起来就是 returnpureunit 都是允许您从头开始制作一个 f,而 fmap 仅允许您在已有另一个的情况下制作 f。除非您有权访问具有“能力”的第三个操作,否则您无法使用 fmap 来实现 return/pure从头开始的 f 。我展示的单位操作可能是具有这种“能力”的最简单的操作。

关于haskell - Haskell中如何用fmap表达return?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19801615/

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