【发布时间】:2014-06-26 04:31:00
【问题描述】:
在 Haskell 中,很容易编写作用于或返回元组的函数,例如前奏函数 splitAt:
splitAt :: Int -> [a] -> ([a], [a])
但是没有简单、方便的方法来编写作用于或导致子集 的函数吗?例如。一个返回 Int 或 Double 的函数。作为一个具体的例子,假设我想写一个函数
MyDivision :: Int -> Int -> (Int + Double)
其中 + 是我的耦合符号,因此如果除法结果为整数,MyDivision x y 将 x/y 作为 Int 返回,但如果除法结果不为整数,则返回 Double。
到目前为止,我似乎有两个选择,要么声明一个新的数据类型
data IntOrDouble = AnInt Int | ADouble Double
或使用
Either Int Double
第一个替代方案需要大量输入和思考名称,而第二个替代方案在您有较大的 cotuples 并且类型看起来像时很快就会变得混乱
Either (Either a (Either b c)) (Either (Either d f) g)
现在,如果我有一个 cotuple 类型,比如说
a + b + c + d
我希望能够形成函数
f :: (a + b + c + d) -> e
g :: (a + b + c + d) -> (e + f + g + h)
只提供函数
f1 :: a -> e, f2 :: b -> e, f3 :: c -> e, f4 :: d -> e
g1 :: a -> e, g2 :: b -> f, g3 :: c -> g, g4 :: d -> h
和设置
f = f1 + f2 + f3 + f4
g = g1 <+> g2 <+> g3 <+> g4
或类似的东西。
这可能吗?
【问题讨论】:
-
你知道
Either Int Double吗? -
@gspr,是的,我是。但在我看到 jozefgs 的回答之前,我认为将它用于更大的联排会有点混乱。
-
抱歉,我现在看到你明确提到了
Either。我在手机上,没看到。 -
没关系,很高兴你对我的问题表现出兴趣。
标签: haskell