Haskell,输入'if'中的解析错误

时间:2012-08-05 06:52:05

标签: haskell

我不能为我的生活弄清楚为什么这个if语句有问题(haskell noobie。)任何人都可以帮助我吗?

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)

3 个答案:

答案 0 :(得分:8)

此代码存在一些问题。对于fractionalKnapsack你有两个不同的定义,每个定义采用不同数量的参数,显然会导致编译器出现问题。 if语句上的解析错误也是因为实际上不应该在if语句中尝试放置if语句,在到达if语句之前,您已经完成了函数的定义。

如果您更好地解释了您正在尝试做什么,或者您希望使用您编写的代码发生什么,这可能会有所帮助。

答案 1 :(得分:8)

:是“cons”运算符。 cons - 通过在左侧提供“head”元素并在右侧提供“tail”列表来构建列表

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

您可以使用:在包含0个以上元素的列表上模式匹配

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”上存在解析错误:因为你使用的编译器/解释器没有想到另一个表达式的开头!

答案 2 :(得分:3)

  

computeKnapsack sort(fracList)

这可能也是一个错误。它应该是computeKnapsack (sort fracList)(或等效地,computeKnapsack $ sort fracList)。

执行computeKnapsack sort(fracList)时,它等于执行computeKnapsack sort (fracList),这相当于执行computeKnapsack sort fracList,这意味着:“给computeKnapsack两个参数:sort和{{1 }}”。