2012-08-05 72 views
0

我不能为我的生活弄清楚为什么这个if语句有问题(haskell noobie。)任何人都可以帮我解决吗?Haskell,在输入'解析错误'

fst3 (a,b,c) = a 
snd3 (a,b,c) = b 
trd3 (a,b,c) = c 
fst4 (a,b,c,d) = a 
snd4 (a,b,c,d) = b 
trd4 (a,b,c,d) = c 
qud4 (a,b,c,d) = d 

fractionalKnapsack (x:xs) = 
    fractionalKnapsack (x:xs) [] 

fractionalKnapsack (x:xs) fracList = 
    ((fst3 x),(snd3 x),(trd3 x),(snd3 x)/(trd3 x)):fracList 
    if length (x:xs) <= 1 
    then computeKnapsack sort(fracList) 
    else fractionalKnapsack xs fracList 

computeKnapsack (x:xs) = (x:xs) 
+7

作为一个侧面说明,使用三元组和四元组通常意味着您应该创建一个新的数据类型,以更充分地描述您的数据。 – 2012-08-05 14:05:26

+4

即使有三元组,也没有必要使用这些笨拙的帮助函数:你可以直接在元组上匹配,即'fractionalKnapsack ls @((f,s,t):xs)fracList = (f, s,t,s/t):fracList' – leftaroundabout 2012-08-05 15:36:23

回答

8

这段代码有几个错误。对于fractionalKnapsack你有两个不同的定义,每个定义都有不同数量的参数,明显会导致编译器有些麻烦。另外,if语句的解析错误是因为实际上不应该有一个if语句,当你试图放一个if语句时,你在到达if语句之前已经完成了函数的定义。

如果您更好地解释了您正在尝试执行的操作,或者您希望使用您编写的代码进行操作,可能会有所帮助。

3

computeKnapsack sort(fracList)

这可能是一个错误了。它应该是computeKnapsack (sort fracList)(或等同于computeKnapsack $ sort fracList)。

当你做computeKnapsack sort(fracList)这等于做computeKnapsack sort (fracList),这相当于做computeKnapsack sort fracList,意思是:“给computeKnapsack两个参数:sortfracList”。

8

:是“cons”操作符。它利弊通过提供左边的“头”元素-tructs列表,你可以模式匹配名单上超过0元素使用:右侧

ghci> 1 : [2,3,4] 
[1,2,3,4] 

“尾巴”名单。

ghci> let (x:xs) = [1,2,3,4] 
ghci> x 
1 
ghci> xs 
[2,3,4] 

,你在你的代码中使用(x:xs)的方式暗示你还没有列出的模式匹配的,也没有定义的牢牢把握。而不是使用

if length (x:xs) <= 1 

它只是模式匹配更常见。一个简单的例子:

howMany :: [a] -> String 
howMany [] = "Zero" 
howMany [x] = "One" 
howMany (x:xs) = "Many" 

Haskell函数可以用“方程式”的这样一个顺序来定义,你对你有兴趣在这给我们带来了其他问题与您的代码可能的情况下,模式匹配,它们是:

  • fractionalKnapsack的公式不匹配。一个有1个参数,另一个有2个。你可能打算命名第二个fractionalKnapsack'
  • fractionalKnapsack定义都不处理空列表大小写。我对此不确定;这可能是可以接受的,如果你知道它永远不会被给出一个空列表。
  • 您的任何函数都没有类型签名。类型推断可以推断出它们,但是首先编写类型签名通常是一个好主意,以表达你对函数的意图并指导你实现它。
  • fractionalKnapsack的第二个定义没有意义。=符号后面只能有一个表达式,但是您提供了两个表达式,用换行符分隔。这是无效的Haskell,并解释了为什么在“if”上有一个解析错误:因为无论您使用的编译器/解释器都不期望另一个表达式的开始!