我在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
答案 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!我强烈建议您阅读并完成许多教程中的一个,因为这比提出个别问题更有效和完整。
让我们从纠正语法错误开始。构造函数(例如Givelist
和Getprod
)必须以大写字母开头。函数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
。