Haskellを使ってプロジェクトオイラーの2番目の問題を解決しようとしています。問題はかなり単純です-4000000未満の偶数フィボナッチ数を合計します(私はOCDであり、わずかに変更された関数を暗示しています-仲裁制限を許可するものです)。
私の最初のコードは次のとおりです。
euler2 limit (num1:num2)
|(num1>limit) = 0
|((num2>limit) && ((mod num1 2) == 0)) = num1
|(num2>limit) = 0
|(((mod num1 2) == 0) && ((mod num2 2) == 0)) = num1+num2+(euler2 limit [num1+num2,num1+num2+num2])
|((mod num1 2) == 0) = num1+(euler2 limit [num1+num2,num1+num2+num2])
|((mod num2 2) == 0) = num2+(euler2 limit [num1+num2,num1+num2+num2])
|otherwise = euler2 limit [num1+num2,num1+num2+num2]
euler2 limit [] = euler2 limit [1,2]
これにより、次のエラーが発生しました。
Occurs check: cannot construct the infinite type: a0 = [a0]
In the second argument of `(>)', namely `limit'
In the first argument of `(&&)', namely `(num2 > limit)'
In the expression: ((num2 > limit) && ((mod num1 2) == 0))
いくつかの試行錯誤を経てnum2
、リストとして型キャストしようとしていることに気付きました。この小さな変更は次のとおりです。
euler2 limit (num1:num2:[]) | (num1 > limit) = 0
問題を修正します。私の質問はなぜですか?何が起こっているのか、そしてなぜそれがキャストnum1
を拒否しnum2
、Intとして拒否したのですか?