1

Haskell のレベル: 初心者

目標: リストとして表されるツリーの要素のルートを見つける

入力 (ツリー ノード) (配列内の位置はノード番号を示します) : [0,1,9,4,9,6,6,7,8,9]

呼び出された関数: getRoot 3

期待される出力: 9

コード:

li = [0,1,9,4,9,6,6,7,8,9]
getRoot::Integer->Integer
getRoot n | li!!n /= n    = getRoot li!!n
getRoot n | otherwise     = li!!n

エラーメッセージ:

ERROR file:.\test2.hs:111 - アプリケーションのタイプ エラー
*** 式 : リ !! n
*** 用語 : n
*** タイプ : 整数
*** 不一致 : Int

コンパイラ: WinHugs

関数の型を宣言するために、「Integers」と「Int」のさまざまな組み合わせを試しました。配列アクセスは Integer を返すようですが、失敗した Int と比較されます。Int を Integers に変換しない理由がわかりません。

それとも一緒に別のものですか?

インターネット、チュートリアル、stackoverflow で検索しました。

4

3 に答える 3

6

インデックス関数 の型(!!)は次のとおりです。

Prelude> :t (!!)
(!!) :: [a] -> Int -> a

インデックスはタイプでなければなりませんInt

あなたはタイプを持っています:

getRoot::Integer->Integer

ここでn、 はIntegerです。Intインデックスとして使用するには、 に変換する必要があります。

これには、次の 2 つの方法があります。

  • を使用して変換fromInteger
  • genericIndexを使用する

また、 Hugs は保守されていない古いバージョンの Haskell であるため、GHC とThe Haskell Platformにアップグレードする必要があります。

于 2012-09-26T16:04:39.297 に答える
2

(!!)タイプがあり[a] -> Int -> aます。の型シグネチャを に変更するgetRootInt -> Int、コードはコンパイルされます。

li :: [Int]
li = [0,1,9,4,9,6,6,7,8,9]

getRoot::Int->Int
getRoot n | li!!n /= n    = getRoot (li!!n)
getRoot n | otherwise     = li!!n

テスト:

> getRoot 3
9
于 2012-09-26T16:05:48.063 に答える
1

(!!) の型は

(!!) :: [a] -> Int -> a 

つまり、受け入れる 2 番目の引数はIntではなく である必要がありIntegerます。それらは異なるタイプです。型シグネチャを代わりに受け入れるように変更するIntと、このエラーはなくなります。

また、これが機能するためにはli、 のリストである必要がありますInt。これは、型シグネチャを追加するだけで実行できます。

li :: [Int]
li = [0,1,9,4,9,6,6,7,8,9]

それで、すべてがうまくいくはずです。幸運を!

于 2012-09-26T16:09:43.973 に答える