haskell,类似于fmap的案例

时间:2016-04-20 08:34:48

标签: haskell monads

我有foo :: a -> a -> Either String TypeConstructor类型的功能 foo可以同时返回throwError StringTypeConstructor

我想做fmap之类的事情。我的意思是我想case (foo x y z) of ... ...表示不同的值(它取决于foo中使用的构造函数值)。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

一种基本方法可能是模仿匹配所有内容

case foo x y of
  Left string -> ...
  Right (Cons1 z w) -> ...
  Right (Cons2 a b c) -> ...
  Right Cons3 -> ...

其中Cons1, ...TypeConstructor的值构造函数。

答案 1 :(得分:2)

你不能直接写

exec(SSH, Command, Timeout) -> {ok, Data} | {error, Reason}
Types:
  Data = list()

然后cmd(Connection, Cmd, Opts) -> {ok, Data} | {error, Reason} Types: Data = [string()] 的类型构造函数上的模式匹配,因为case (foo x y) of ... 没有正确的类型(TypeConstructor)。

但是,您可以在foo x y的结果Either String TypeConstructor上定义一个模式与TypeConstructor的类型构造函数匹配,然后fmap匹配的函数,如下所示。

foo x y