0

良い一日!

だから私は次のようにHaskellである関数を書こうとしています

remove_nulls :: [ ([String], Int) ] -> [ ([String], Int) ] -> [ ([String], Int) ]
remove_nulls listofpair (y:ys)
| null listofpair = (y:ys)
| null (fst(head listofpair))= remove_nulls (tail listofpair) (y:ys)
| otherwise = remove_nulls (tail listofpair) (y:(head listofpair):ys)

次のような入力を受け取ります

remove_nulls [ ([],0) , (["abc", "dce"], 2) ] []

アイデアは、最初の値に null が含まれている場合、リストからタプルを削除するというものです。ただし、呼び出すたびに、「関数 remove_nulls の非網羅的なパターン」が返されます。

基本ケースを変更しようとしましたが、常に同じ結果が得られます。どんな助けや搾取も素晴らしいでしょう (現在、Haskell を学んでいます)。

4

4 に答える 4

6

最初のフィールドが null のすべてのペアを削除するだけの場合は、

removeNulls xs = filter (not . null . fst) xs

まさにそれを行います。の表記法に慣れていない場合は(not . null . fst)、関数を簡単に記述する方法にすぎません\pair -> not (null (fst pair))。詳細については、この SO の質問を参照してください。

元の関数は、2 番目の入力リストの最初の要素の直後に最初のリストから適切な要素を挿入しようとしているようですが、2 番目のリストが空の場合をカバーしていないため、機能しません。

于 2013-11-05T08:20:50.713 に答える
0

もう 1 つの条件を追加するのを忘れています: when second list is empty

remove_nulls :: [([a], t)] -> [([a], t)] -> [([a], t)]
remove_nulls [] ys = ys
remove_nulls (([], _):xs) ys = remove_nulls xs ys
remove_nulls (x:xs) [] = remove_nulls xs [x]       -- new condition
remove_nulls (x:xs) (y:ys) = remove_nulls xs (y:x:ys)
于 2013-11-05T10:53:10.800 に答える
0

2 番目の引数として空のリストを指定して remove_nulls を呼び出し、2 番目の引数に少なくとも 1 つの要素がある場合 (これは(y:ys)最初の行のパターン) の定義のみを提供するため、一致するものが見つからず、エラーが発生します。あなたが見るメッセージ。

マッチを取り除けば、コンパイルする必要があると思います(ただし、試したことはありません)y:(ただし、まだ希望どおりに動作していない可能性があります!)。したがって、代わりに次のようなことを試してください。

remove_nulls :: [ ([String], Int) ] -> [ ([String], Int) ] -> [ ([String], Int) ]
remove_nulls listofpair ys
  | null listofpair = ys
  | null (fst (head listofpair))= remove_nulls (tail listofpair) ys
  | otherwise = remove_nulls (tail listofpair) (head listofpair:ys)
于 2013-11-05T09:03:27.203 に答える
0

remove_nullsリストを取得して新しいリストを返す必要があるため、次のようになります。

remove_nulls :: [ ([String], Int) ] -> [ ([String], Int) ]
remove_nulls lst = [(x,y) | (x,y) <- lst, (not.null) x]
于 2013-11-05T08:15:53.787 に答える