4

私は Haskell の初心者で、リストをほぼ同じサイズの 2 つのサブリストに分割しようとしています。モジュールはロードできますが、ghci を実行しようとすると機能しません。
例:divideList [1,2,3,4] = [1,2] [3,4] splitList [1,2,3,4,5] = [1,2,3] [4,5]

divideList [] = ([],[])
divideList [x] = ([x],[])

divideList ((x:xs):ys) = if a < b
                         then splitAt (a+1) ((x:xs):ys)
                         else divideList (xs:ys)            
                             where a = length xs
                                   b = length ys 

「リテラル '2' から生じる (Num[t0]) のインスタンスはありません」と述べています。修正方法がわかりません。誰でも私を助けることができますか?ありがとう!

これは、ghci で「divideList [2,3,5]」と入力したときに表示されるエラーです。

<interactive>:2:13:
    No instance for (Num[a0]) arising from literal '2'
    Possible fix: add an instance declaration for (Num[a0])
    In the expression: 2 
    In the first argument of 'divideList', namely "[2,3,5]
    In the expression: divideList [2,3,5]
4

2 に答える 2

6

最初に: おい、私の {formatting, type signatures} はどこだ?

2番目:あなたが話しているエラーは1、型が値がリストであるべきだと言っている場所で数値リテラル(例:)を使用したことを示しています。リテラルの解釈は柔軟 (ポリモーフィック) であるため、型チェッカーは、数値をリストとして解釈する方法を指定する必要があると警告します。

3番目:投稿されたコード(再フォーマットされ、以下の型シグネチャが提供されています)は、あなたが主張するエラーを生成しません。

4番目:投稿されたコードは、あなたが説明したタスクを実行しません-タイプシグネチャだけが強力なヒントです-説明した関数は、リストをリストのペアにする必要があります([a] -> ([a],[a])ただし、リストのリストを消費する関数を定義しました([[a]] -> ([[a]],[[a]]))...

divideList :: [[a]] -> ([[a]], [[a]])
divideList [] = ([],[])
divideList [x] = ([x],[])
divideList ((x:xs):ys) =
    if a < b
      then splitAt (a+1) ((x:xs):ys)
      else divideList (xs:ys)
  where a = length xs
        b = length ys
于 2013-09-30T05:28:17.487 に答える
0

トーマスが言うように、実装を書く前に型シグネチャを書き出すと、通常、コードで何をしたいのかをよりよく理解できるはずです。

あなたのコードの理解が正しければ、提供されたリストの左側から始めて、リストの左側が右側のサイズ以上になるまで進むつもりでした.どのポイントで分割しますか。

この場合、コードにいくつかのバグがあります。

  1. 現在のロジックは if a < b then split です。ここで、a = 長さ xs (左側を想定) および b = 長さ ys (右側を想定)。左から始めると仮定すると、左辺は最初から右辺よりも小さくなります! したがって、この場合、代わりに a > b を使用する必要があります。

  2. パターン マッチングの使用が正しくありません - (x:xs):ys は、「リストの最初の要素を (x:xs) として取得します。これは、単一の要素 x にリスト xs の残りを加えたものであり、残りを ys として取得します。 "。したがって、このパターン マッチングは、リスト (2) の最初の要素をリストに変換して、そこから (x:xs) を抽出できるようにしようとしています。これがエラーの原因です。

リストを大まかに半分に分割したい場合は、単に次のようにします

mySplit list = splitAt ((length list) `div` 2) list

これははるかに簡単です:)

于 2013-09-30T10:23:07.690 に答える