1

まず、ubuntu 11.10でghciを使用して、haskellコードを実行しています。2番目はこれがhaskellでの私の最初の試みです。第三に、ファイルをghciにロードするにはどうすればよいですか?また、ファイルをどこに配置する必要があり、その拡張子はどのようにする必要がありますか?「:l "file.haskelxtnsn"」がファイルのロード方法であることは知っていますが、これが今のところ私の最善の推測です。

上記を実行できるので、このコードは、無限の可能性があるサイズの2つのリストを昇順でマージするためにどのように検索しますか。(インデントのため、これをプレリュード>プロンプトに入れることはできません???)[1、2、3]と[4、5、6]が与えられた場合、[1、2、3、4、5、6]を取得する必要があります]、使用法は「take 10(merge listx listy)」になると思います

let merge x y = (min (head x) (head y)) : 
     case (min (head x) (head y)) of 
         head x -> merge (drop 1 x) y 
         head y -> merge x (drop 1 y)

疑似:

  • リストの先頭の最小値を出力します
  • 最初のリストの先頭が出力された場合は、最初のリストの残りと2番目のリストとのマージを呼び出します
  • それ以外の場合は、最初のリストと2番目のリストの残りの部分でmergeを呼び出します
4

2 に答える 2

1
  • 通常、使用される拡張子は「.hs」です。
  • :cdghciでディレクトリを変更するために使用できます。また、 :load:l略して)コマンドへのパスを指定することもできます。
  • あなたの論理は正しいですが、多分私はそれを少し異なって書くでしょう(うまくいけば、あなたは節とwhere節について知っていて、関数を一連の方程式として定義します):

    merge [] ys = ys
    merge xs [] = xs
    merge xs ys = min x y : if x < y then merge (tail xs) ys
                                     else merge xs (tail ys)
            where x = head xs
                  y = head ys
    
  • ghciでは、定義の前にaが必要です。letこれは、式とは異なりlet ... in ...ます。これはかなり紛らわしいので、コードをファイルに入れてghciにロードすることをお勧めします。
  • 関数適用は:演算子よりも優先順位が高いため、括弧は必要ありません。通常、コードをより簡潔にするために括弧の数を最小限に抑えようとしますが、熱心になりすぎないようにしてください。
  • ここでcase式を使用する意味は実際にはわかりません(エラーを引き起こすことを除いて)。パターンマッチングの詳細、データコンストラクターと関数アプリケーション、head xパターン内で使用できないのに使用できる理由を読んでみてくださいx:xs(ここでは使用しませんでしたが)。呼び出しheadmin複数回の呼び出しは冗長に見えます、そしてあなたはまた。で置き換えることができdrop 1ますtail
于 2012-07-27T18:20:30.403 に答える
1

これをGHCiプロンプトに入力する場合は、次のように入力できます。

> let merge x y = (min (head x) (head y)) : case (min (head x) (head y)) of { 
     head x -> merge (drop 1 x) y ; head y -> merge x (drop 1 y) }

つまり、インデントの代わりに明示的な中括弧を使用します(上記はすべて1つの途切れのない行に入力することを意味します)。ロードするファイルにコードを入れるときは、先頭letを使用しないでください。

コード自体に関しては、「パターンの解析エラー」というエラーが発生します。これは、head xが有効なパターンではないためです。

あなたはここでmerge例えばコードを見つけることができます:

merge (x:xs) (y:ys) | y < x     = y : merge (x:xs) ys
                    | otherwise = x : merge  xs (y:ys)
merge  xs     []                = xs
merge  []     ys                = ys

これにより、重複が保持されます。

于 2012-07-27T18:21:37.220 に答える