我怎么能在haskell中有一个函数返回一个布尔值或一个布尔列表?

时间:2014-11-25 00:39:50

标签: haskell

我在haskell(让它叫'哑')中有功能,它调用了3个不同的功能。这三个不同的函数返回不同的类型,例如布尔值或布尔值列表。如何定义函数'哑'来返回布尔值或布尔值列表?

data Sumtype = givelist Integer | getprod Integer 
prod :: Int -> Int
prod x = x*3

listnums :: Int -> [Int]
listnums x = [1...x]

dumb :: Sumtype -> (what comes here..?)
dumb (givelist x) -> listnums x
dum (getprod x) -> prod x

3 个答案:

答案 0 :(得分:6)

您返回Either Boolean [Boolean]。但我对你的动机持怀疑态度。这听起来像是一个X / Y问题。

答案 1 :(得分:1)

您可能正在寻找Either类型,尽管如此,您的函数将返回Either值。它的定义如下:

data Either a b = Left a | Right b

如果要定义一个可以返回Bool或Bool列表的函数,其类型应如下所示:

dumb :: Either Bool [Bool]

在这种情况下,'dumb'将是一个不接受任何参数并返回Bool或Bool列表的函数。在函数体中,你可以像这样返回一个Bool:

Left bool

或者像这样的bool列表:

Right [bool]

您可以在此处查看具体示例:http://en.wikibooks.org/wiki/Haskell/More_on_datatypes#More_than_one_type_parameter

尽管如此,Sebastian要求您提供更多详细信息的原因是,在错误处理之外很少使用这两种方法(无论如何我都知道AFAIK)。在你的情况下你可能根本不需要它,但我们无法确定,除非你告诉我们更多关于你在'哑'中使用的其他功能以及你的目标。

答案 2 :(得分:0)

不相关的探测器

看来你是初学者 - 欢迎来到Haskell!我强烈建议您阅读并完成许多教程中的一个,因为这比提出个别问题更有效和完整。

语法

让我们从纠正语法错误开始。构造函数(例如GivelistGetprod)必须以大写字母开头。函数dumb被错误输入一次。函数定义使用=而不是->

类型

现在我们要解决类型错误。 Sumtype使用Integer,然后您切换为使用Int。为简单起见,让我们坚持使用Integer

通过这些修复我们得到:

data Sumtype = Givelist Integer | Getprod Integer 

prod :: Integer -> Integer
prod x = x*3

listnums :: Integer -> [Integer]
listnums x = [1...x]

dumb :: Sumtype -> (what comes here..?)
dumb (Givelist x) = listnums x
dumb (Getprod x)  = prod x

问题

你想知道“这里有什么”,其中'here'是结果类型。如上所述,该功能实际上是无效的。一个定义产生一个整数列表[Integer],而另一个定义产生一个整数Integer。一种解决方案是使用总和类型,例如Either Integer [Integer] - 这非常类似于您之前存在的Sumtype

dumb :: Sumtype -> Either Integer [Integer]

所以现在我们需要在函数定义中返回Either的构造函数。您可以查看文档或使用:info Either中的GHCi来了解构造函数,如果您没有记住它们。

dumb (Givelist x) = Right (listnums x)
dumb (Getprod x)  = Left (prod x)

请注意,我们必须使用Left作为返回Integer的第二种情况,因为我们在Either之后编写的第一种类型(左侧类型)是Integer