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

Chr*_*ton 6 haskell

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

luq*_*qui 9

Either - 或者相当于它的自定义数据类型 - 是唯一的方法.这是一个愚蠢的例子:

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

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

foo n = case stuff n of
            Left (a,b) -> ...
            Right pairs -> ...
Run Code Online (Sandbox Code Playgroud)

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

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