2

まず、私の質問にお答えいただきありがとうございます。

まず、私のコードを簡単に見てください。コードを理解する必要はありません。型に注意してください。

これは、次のようなエラーを返します。

Couldn't match expected type `Int' with actual type `Integer'
Expected type: [Int]
  Actual type: [Integer]
In the first argument of `myfun', namely `primes'
In the expression: myfun primes

失敗しました。モジュールがロードされました: なし。

タイプを Integer ではなく Int に変更すると、エラーなしでこれを正常に実行できます。たとえば、「primes :: [Int]」

ただし、プログラムが大きな数を取ることができるようにするには、整数のままにしておく必要があります。

よろしくお願いいたします。

4

3 に答える 3

2

エラーは次の場所から発生(!!)していますmyfun

myfun (a:ab) = fibs !! (a-1) : myfun(ab)

新しいGHCがおそらくあなたに知らせたでしょう(私は思います)。これを試して:

myfun (a:ab) = fibs !! ((fromInteger a)-1) : myfun(ab)

fromInteger結果タイプは多形であるため、ここで型システムは必要なものを推測しますInthoogleはこの種の質問について多くのことを知っています。

于 2013-01-24T06:12:33.053 に答える
0

のタイプは、myfunのタイプから派生します。リストインデックスとして数値を使用している場合は、それを作成する必要があります。とにかく、数値はリストの容量によって制限されます。!![a] -> Int -> aInt

于 2013-01-24T06:12:06.593 に答える
0

タイプエラーの理由は、タイプがであるためです。(!!)その[a] -> Int -> a結果、myfunのタイプはとして推定され[Int] -> [Integer]ます。

Integer本当にsが必要な場合fromIntegralは、役に立ちません。素数がを超えると、アプリケーションが負のインデックスでクラッシュするだけmaxBoundです。

ただし、(!!)無症状の複雑さは低いため、最善の解決策は、2次実行時の動作を必要としないようにアルゴリズムを作り直すことです。

たとえば、パスごとにfibのリスト全体をトラバースする代わりに、ドロップするインデックス間隔のリストとして素数を表すことができます。

> import Data.List
> intervals :: [Integer]
> intervals = zipWith (-) (tail primes) primes

そして、fibsからプライム間隔を削除した結果を収集します。

> partC :: [Integer]
> partC = map head $ scanl (flip genericDrop) (tail fibs) intervals

tail fibsフィボナッチ数列の最初の数字をスキップしてから、ここで使用しました。

于 2013-01-26T04:48:34.690 に答える