让我们说我得到了以下非常基本的例子:
f :: Either Int String -> IO ()
以及函数g :: Int -> IO ()
和函数g' :: String -> IO ()
我基本上想要实现f
作为"选择器"调用g
或g'
取决于它的输入,以便将来我只需要工作f
因为我知道我的程序只会遇到Int或串.
这种使用方式Either
有意义吗?该约定似乎主要用于错误和异常处理.
如果它确实有意义,那么实施这样一个例子的好方法或最佳实践是什么?我听过/读过关于case
bifunctors的信息.
如果没有:haskell处理不同输入类型可能性的方法是什么?或者这是从一开始就应该避免的事情?
所以这绝对是有意义的,并且实现的一种方法是:
f :: Either Int String -> IO () f e = case e of Left l -> g l Right r -> g' r
或使用either
:
import Data.Either (either) f :: Either Int String -> IO () f = either g g'
请注意,在第二个版本中,我没有为Either Int String
参数指定变量名称.这称为eta转换/ eta减少.但显然你也可以写f e = either g g' e
.
作为扶手椅Haskell程序员,对我来说似乎很好.
f :: Either Int String -> IO () f (Left n) = g n f (Right s) = g' s