Haskell - 接受不同的类型并采取相应的行动

时间:2015-12-08 12:43:46

标签: haskell

让我们说我得到了以下非常基本的例子:

f :: Either Int String -> IO ()

以及函数g :: Int -> IO ()和函数g' :: String -> IO (),我基本上想要将f实现为"选择器"根据其输入调用gg',以便将来我只需要使用f,因为我知道我的程序只会遇到Int或String。

这种使用Either的方式有意义吗?该约定似乎主要用于错误和异常处理。

如果它确实有意义,那么实施这样一个例子的好方法或最佳实践是什么?我已经听过/读过case以及bifunctors。

如果没有:haskell处理不同输入类型可能性的方法是什么?或者这是从一开始就应该避免的事情?

2 个答案:

答案 0 :(得分:8)

所以这绝对是有意义的,并且实现的方法之一是:

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 conversion / eta reduction。但显然你也可以写f e = either g g' e

答案 1 :(得分:5)

作为Haskell扶手椅的程序员,对我来说似乎很好。

f :: Either Int String -> IO ()
f (Left n) = g n
f (Right s) = g' s