我对函数式编程和Haskell都是全新的,所以我不确定我是否正确地提出了这个问题,或者它是否有意义,但我决定尝试,因为我还没有找到任何有用的东西。我基本上试图实现一个可以返回Int
,String
或列表的函数。我知道我可以使用Either
返回两种类型之一,但我想返回三种或更多种中的一种。我尝试定义一个新类型,但我卡住了。
data Rets = Int | String | Bool
checkInt :: Rets -> Bool
check x = case x of
Int x -> True
如果给出checkInt
, True
应返回Int
,它只是用于测试,但无论如何我都包含了它。
我知道我的问题很乱,所以我会感谢任何解释。提前谢谢!
答案 0 :(得分:5)
您定义了一个带有三个构造函数的类型,每个构造函数都有0个参数。因此Int x
不是您的类型的有效模式,它只是Int -> true
。当然这也意味着你不能在你的类型中存储任何值,因此它不能达到你想要的效果。
你想要的是这样的:
data Rets = IntRet Int | StringRet String | BoolRet Bool
这定义了三个名为IntRet
,StringRet
和BoolRet
的构造函数,分别取Int
,String
和Bool
。这样,您可以使用IntRet 42
,BoolRet True
等构建值,然后将它们模式匹配为IntRet x
,依此类推。