0

ifステートメント(haskell noobie)になぜ問題があるのか​​、私は一生理解できません。誰かが私を助けてくれますか?

fst3 (a,b,c) = a
snd3 (a,b,c) = b
trd3 (a,b,c) = c
fst4 (a,b,c,d) = a
snd4 (a,b,c,d) = b
trd4 (a,b,c,d) = c
qud4 (a,b,c,d) = d

fractionalKnapsack (x:xs) =
    fractionalKnapsack (x:xs) []

fractionalKnapsack (x:xs) fracList =
    ((fst3 x),(snd3 x),(trd3 x),(snd3 x) / (trd3 x)):fracList
    if length (x:xs) <= 1
    then computeKnapsack sort(fracList)
    else fractionalKnapsack xs fracList

computeKnapsack (x:xs) = (x:xs)
4

3 に答える 3

8

:「短所」演算子です。左側に「head」要素、右側に「 tail」リストを提供することにより、リストを構成します。

ghci> 1 : [2,3,4]
[1,2,3,4]

を使用して、要素が0を超えるリストでパターンマッチングを行うことができます:

ghci> let (x:xs) = [1,2,3,4]
ghci> x
1
ghci> xs
[2,3,4]

コードで使用(x:xs)している方法は、リストの定義やパターンマッチングをまだしっかりと把握していないことを示唆しています。使用するのではなく

if length (x:xs) <= 1

単純にパターンマッチするのがより一般的です。簡単な例:

howMany :: [a] -> String
howMany [] = "Zero"
howMany [x] = "One"
howMany (x:xs) = "Many"

Haskell関数は、このような一連の「方程式」で定義できます。ここでは、関心のある可能性のあるケースでパターンマッチを行います。これにより、コードに関する他の問題が発生します。

  • の方程式がfractionalKnapsack一致しません。1つには1つの引数があり、もう1つには2つの引数があります。おそらく2番目に名前を付けるつもりfractionalKnapsack'でした。
  • どちらのfractionalKnapsack定義も空のリストの場合を処理しません。これについてはよくわかりません。空のリストが決して与えられないことがわかっている場合、これは許容できるかもしれません。
  • どの関数にも型シグネチャはありません。型推論はそれらを推論することができますが、関数の意図を表現し、その実装をガイドするために、最初に型シグネチャを記述することをお勧めします。
  • の2番目の定義はfractionalKnapsack意味がありません。記号の後には1つの式しかありませ=んが、改行で区切って2つ指定しました。これは無効なHaskellであり、「if」で解析エラーが発生する理由を説明しています。使用しているコンパイラ/インタプリタが別の式の開始を予期していなかったためです。
于 2012-08-05T14:56:12.627 に答える
8

このコードにはいくつか問題があります。fractionalKnapsack には 2 つの異なる定義があり、それぞれが異なる数の引数を取るため、明らかにコンパイラに問題が発生します。また、if ステートメントの解析エラーは、if ステートメントを配置しようとしている場所に実際には if ステートメントがあってはならないためです。if ステートメントに到達する前に、関数の定義が既に完了しています。

あなたがやろうとしていること、またはあなたが書いたコードで何が起こると予想されるかをよりよく説明すれば、少しは役立つかもしれません.

于 2012-08-05T07:27:53.767 に答える
3

computeKnapsack sort(fracList)

それも多分エラー。computeKnapsack (sort fracList)(または、同等に、 )である必要がありますcomputeKnapsack $ sort fracList

computeKnapsack sort(fracList)これはdoingcomputeKnapsack sort (fracList)と同等です。これは、computeKnapsack sort fracList「computeKnapsack に 2 つの引数を与える:sortと」を意味しfracListます。

于 2012-08-05T14:12:59.867 に答える