为什么这个Haskell不正确?

时间:2009-11-23 17:12:43

标签: syntax haskell syntax-error

我有一个看起来像这样的Haskell文件:

longest::[Integer]->[Integer]->[Integer]
max a b = if length a > length b then a else b

llfs::[Integer]->Integer
llfs li = length(foldl longest group(li))

llfs([1, 2, 3, 3, 4, 5, 1, 1, 1])

哪个应该在最后打印出函数调用的结果,但是当我运行该文件时出现此错误:

parse error (possibly incorrect indentation)

我不明白我做错了什么。我该怎么做才能解决它?


修改

将最后一行放在main函数中后,如下所示:

import List

longest::[Integer]->[Integer]->[Integer]
longest a b = if length a > length b then a else b

llfs::[Integer]->Integer
llfs li = length(foldl longest group(li))

main = print (llfs [1, 2, 3, 3, 4, 5, 1, 1, 1])

我现在收到以下错误:

C:\Users\Martin\Desktop\Haskell\Q1.hs:7:31:
    Couldn't match expected type `[Integer]'
           against inferred type `[a] -> [[a]]'
    In the second argument of `foldl', namely `group'
    In the first argument of `length', namely
        `(foldl longest group (li))'
    In the expression: length (foldl longest group (li))

这个看起来有点困难!我该如何解决?

8 个答案:

答案 0 :(得分:7)

您的代码不正确。

这个

longest::[Integer]->[Integer]->[Integer]
max a b = if length a > length b then a else b

应该是

longest::[Integer]->[Integer]->[Integer]
longest a b = if length a > length b then a else b

你需要一个主要功能

main = do print llfs([1, 2, 3, 3, 4, 5, 1, 1, 1])

只是为了改进你的代码,如果你有一个函数签名并给它一个小写字母作为它的类型(比如字母a),它就变成了通用的。例如

longest:: [a] -> [a] -> [a]
longest x y = if length x > length y then x else y

意味着它不仅仅处理整数列表,而是处理任何事物的列表。突然间你有一个非常可重复使用的功能。

答案 1 :(得分:7)

在第

llfs li = length(foldl longest group(li))

解释器将group视为foldl的第二个参数。写group(li)与撰写group li没有什么不同。

此外,foldl需要初始值。另一方面,foldl1使用第一个列表元素作为其初始值。尝试:

llfs li = length (foldl1 longest (group li))

(编辑删除第一个错误答案。)

答案 2 :(得分:6)

module Main where

import Data.List

longest::[Integer]->[Integer]->[Integer]
longest a b = if length a > length b then a else b

llfs::[Integer]->Int
llfs li = length $ foldl1 longest $ group li

main = do
    putStrLn $ show $ llfs [1, 2, 3, 3, 4, 5, 1, 1, 1]

答案 3 :(得分:4)

问题是最后一行没有定义一个函数,正如其他人所说的那样。你的代码中有更多错误。看来这就是你想要做的事情:

import Data.List

longest_group_size :: [Integer] -> Int
longest_group_size = maximum . map length . group

main :: IO ()
main = print $ longest_group_size [1, 2, 3, 3, 4, 5, 1, 1, 1]

观察:

  1. 您需要import Data.List才能使用group
  2. 在这种情况下无需使用foldr:通过使用map,每组的长度仅计算一次。
  3. 这当然意味着我们在另一个函数maximum的帮助下调用。

答案 4 :(得分:3)

您不能像在python或其他脚本语言中那样在文件范围内调用函数。因此,最后一行中对llfs的“调用”是一个错误。尝试在main

中打印结果
main = print (llfs [1, 2, 3, 3, 4, 5, 1, 1, 1])

目前“函数调用”看起来像一个不完整的函数定义,右侧缺失,这会导致出现令人惊讶的错误消息:

llfs (...) = abc

答案 5 :(得分:3)

问题在于这一行:

llfs([1, 2, 3, 3, 4, 5, 1, 1, 1])

那不是函数声明。我想你正在尝试进行函数调用,在这种情况下你需要把它放在main声明中。您还可以将Haskell文件加载到解释器(例如ghci)并在解释器控制台中执行函数调用。

答案 6 :(得分:2)

这不是导致错误的直接原因,但我认为这是导致误解的一个因素。在Haskell中,你永远不会写group(li)。对单个参数进行括号化是没有意义的 - 它完全等同于group li。如果您试图将此函数调用的结果传递给另一个函数,则需要将整个表达式括起来 - (group li) - 或使用像Caleb建议的$运算符。

答案 7 :(得分:2)

更新的两个小问题。首先,您似乎试图将group结果作为参数传递给foldl。正确的说法是(group li)而不是group(li)第二种方式是foldl需要一个基本案例。 Caleb建议使用foldl1是一个可能对您有用的选项。