我有foo :: a -> a -> Either String TypeConstructor
类型的功能
foo
可以同时返回throwError String
和TypeConstructor
。
我想做fmap
之类的事情。我的意思是我想case (foo x y z) of ...
...
表示不同的值(它取决于foo中使用的构造函数值)。
有没有办法做到这一点?
答案 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