代码之家  ›  专栏  ›  技术社区  ›  Flame_Phoenix

如何使用Monadex链接结果monad?

  •  0
  • Flame_Phoenix  · 技术社区  · 3 年前

    出身背景

    在我寻求了解更多关于 Monadex 我试图在一个函数中多次链接一个结果单子。 我知道这是通过 fmap ,一个函数,它接受一个函数和一个单子,并返回一个单子。

    defmodule TestMonadex do
      use Monad.Operators
    
      import Monad.Result
    
      # This wont work
      def p2(x) do
        x
        |> success()
        <|> (&plus_1/1)
        <|> (&plus_1/1) 
      end
    
      defp plus_1(n), do: n + 1
    end
    
    

    问题

    这里的问题是,根据文档,Result Monad没有实现 fmap :

    https://hexdocs.pm/monadex/Monad.Result.html#content

    问题

    • 为什么我的例子不起作用?
    • 如何将结果链接到Monad?
    0 回复  |  直到 3 年前
        1
  •  2
  •   Paweł Obrok    3 年前

    从一个简单的源头开始 <|> monadex中的运算符的参数似乎与 Functor.fmap .所以这是可行的:

    (&plus_1/1) <|> (&plus_1/1) <|> success(x)
    

    这也适用于:

    success(x) |> Functor.fmap(&plus_1/1) |> Functor.fmap(&plus_1/1)
    

    不确定这是出于设计还是一个bug——文档非常稀少。也许你的想法是首先用 <|> 最后将其应用于一个值,甚至可能应用于代码的另一部分?