2

我有一个看起来像这样的 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))

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

4

8 回答 8

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

这意味着它不仅适用于整数列表,还适用于任何东西的列表。突然之间,您有了一个非常可重用的功能。

于 2009-11-23T17:20:24.220 回答
7

在行

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

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

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

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

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

于 2009-11-23T17:32:03.087 回答
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]
于 2009-11-23T17:27:19.417 回答
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.
于 2009-11-23T17:22:06.820 回答
3

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

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

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

llfs (...) = abc
于 2009-11-23T17:20:01.520 回答
3

问题是这一行:

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

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

于 2009-11-23T17:20:56.387 回答
2

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

于 2009-11-23T18:43:31.870 回答
2

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

于 2009-11-23T18:00:38.803 回答