如何获取返回不同类型的函数

时间:2011-01-22 22:01:25

标签: haskell

所以,我有一个具有多个定义(守卫)的函数,并且根据它匹配的那个,我试图让它返回(a,b)或[(a,b)],但是编译器会抛出错误,因为它们是不同的类型。我试图用Either来解决这个问题,但可能没有正确使用它:P。有什么帮助吗?

2 个答案:

答案 0 :(得分:9)

Either - 或与之等效的自定义数据类型 - 是执行此操作的唯一方法。这是一个愚蠢的例子:

stuff :: Int -> Either (Int,Int) [(Int,Int)]
stuff 0 = Left (0, 0)
stuff n = Right [ (x,x) | x <- [0..n] ]

然后当有人调用此函数时,他们可以模式匹配以找出它返回的两种类型中的哪一种:

foo n = case stuff n of
            Left (a,b) -> ...
            Right pairs -> ...

然而,对你的问题一无所知,一般来说我会建议你多考虑一下你的功能的含义。它需要什么,它返回什么?准确,数学。答案越简单,此函数将更顺利地与您的程序的其余部分和Haskell的概念一起使用。对我来说,在这样的描述中,Either很少出现。你如何统一这两个结果?也许你只返回单身人士名单[(a,b)]而不是Left (a,b),如果这对你的职能有意义的话。

Haskell与那些试图过于聪明的函数不兼容,这些函数可能来自Python或jQuery。保持愚蠢和精确 - 从撰写这些简单的部分中获得复杂性。如果您对此感到好奇,请提出另一个问题,其中包含有关您的问题的更多详细信息,您要完成的任务以及您希望它以何种方式运行。对不起讲道: - )

答案 1 :(得分:0)

Haskell中的函数只能返回一种类型,因此它可以为你工作,因为它会使你的函数返回类型E(a,b)[(a.b)]。

我不确定您如何使用Either出了什么问题,但这里有一个简单的例子:

test a b = 
    if a == True 
    then Left (a,b) 
    else Right [(a,b)]
相关问题