【发布时间】:2013-05-01 09:20:45
【问题描述】:
所以我对编程仍然很陌生,而且我在 Haskell 的语法方面遇到了很多困难。我有点知道我想实现什么,但我不确定如何去做,所以我来这里问。
所以我所拥有的是由 3 个不同函数定义的无特定顺序的“一堆”数字。一个例子是:
lowestnumber = 4
highestnumber 5 = True
highestnumber _ = False
above 4 = 11
above 11 = 18
above 18 = 2
above 2 = 3
above 3 = 5
above 5 = error "highest Number"
above _ = error "Not part of the pile"
现在,我想编写一个函数来检查某个数字是否是这个堆的一部分,以及一个不同的函数“sum' =”,它可以在没有输入变量的情况下对列表的所有元素进行求和。首先,我通过定义一个列表并使用 listcommands 来解决这些问题,以便总结并查看该列表中是否有“elem”,但我应该在不使用列表的情况下解决它。
所以我有如何解决这个问题的想法,但我不知道如何在没有收到无数错误的情况下实际编写它。 我为检查功能尝试过的一些示例:
check x = if above x /= error "Not part of the stack" || lowestnumber == x then True else False
我也尝试过像这样使用“_”进行检查,但它也不起作用:
check x if above x == _ || lowestnumber == x then True else False
我对 sum 函数的想法是这样的:
sum' = lowestnumber + above lowestnumber + above (above lowestnumber) + above (above (above lowestnumber))
或者类似的东西
sum' = lowestnumber + (above sum')
据我了解
等等,但我不知道如何使用递归来实现这一点,这显然是要走的路。
希望这个问题不会太愚蠢!我希望你能帮助我:)
编辑:好的,这些是我的 3 个功能问题的解决方案
sumup' a b
|highestNumber a == True = a+b
|otherwise = sumup' (above a) (a+b)
sumup = sumup' lowestNumber 0
check' a b
|a == b = True
|True == highestNumber a && a==b = True
|True == highestNumber a && a/=b = False
|check' (above a) (b) == True = True
|otherwise = False
check b = check' (lowestNumber) (b)
above' :: Integer -> Integer -> Bool
above' x y
| check x == False = False
| check y == False = False
| highestNumber y == True = False
| highestNumber x == True = True
| x==y = True
| above' x (above y) == True = True
| otherwise = False
【问题讨论】:
-
首先,我建议阅读有关haskell 的适当教程,例如Learn You A Haskell,它是免费的!更重要的是,
error无法按照您尝试使用的方式工作。通常应该避免,您最好查看Maybe。 -
我一直在阅读《Learn You A Haskell》,我在那里找不到我的问题的答案,但我可能只是做得还不够!无论如何,我会调查一下Maybe
-
你能用命令式语言写吗?如果您可以比较它,它可能更容易理解。将其发布到jsfiddle.net 并尝试用haskell 进行翻译。
-
我不能。 Haskell 是我学习的第一门语言。
-
好的,将您的完整代码发布到hpaste.org,这样我们就有了更好的画面。另外,我建议您在 haskell irc 中闲逛一段时间,以便在您尝试一些东西时直接问一些小的问题。