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

行で

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

インタプリタは。groupの2番目の引数として扱っていますfoldl。書くgroup(li)ことは書くことと同じgroup liです。

また、foldl初期値が必要です。 foldl1一方、初期値には最初のリスト要素を使用します。試す:

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

(最初の間違った答えを削除するために編集されました。)

于 2009-11-23T17:32:03.087 に答える
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 に答える
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。各グループの長さを使用すると、1回だけ計算されます。
  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

これはどちらのエラーの直接的な原因でもありませんが、それがあなたの誤解の一因であると思います。Haskellでは、あなたは決して書くことはありませんgroup(li)。単一の引数を括弧で囲むことは無意味です—それはとまったく同じgroup liです。この関数呼び出しの結果を別の関数に渡そうとしている場合は、式全体を括弧で囲む必要があります— (group li)—または$Calebが提案したような演算子を使用します。

于 2009-11-23T18:00:38.803 に答える
2

アップデートに関する2つの小さな問題。groupまず、結果を引数としてに渡そうとしているようですfoldl。2つ目では(group li)なく、それを言う正しい方法は、ベースケースが必要なことです。使用するカレブの提案は、おそらくあなたのために働くだろう1つのオプションです。group(li)foldlfoldl1

于 2009-11-23T18:43:31.870 に答える