2016-03-27 8 views
0

イムそれにハスケルと再帰を学び、私が持っているこの機能なぜ「サブコンビナの関数で非網羅的なパターン」を取得していますか?

type Coordenada = (Int,Int) 
type Skyline = [Coordenada] 

combina :: (Skyline, Skyline) -> Skyline 
combina ([], x) = x 
combina (x, []) = x 
combina ((ii, ia):ri,(di, da):rd) = subcombina((ii, ia):ri,0) ((di, da):rd,0) 
     where subcombina ((ii, ia):ri, ih) ((di, da):rd, dh) 
          | ii < di    = (ii, max ia dh) : subcombina(ri,ih) ((di, da):rd, dh) 
          | otherwise    = (di, max ih da) : subcombina((ii, ia):ri, ih) (rd, dh) 

そして、このエラーになっイム:

Exception: Skyline.hs:(26,11)-(28,92): Non-exhaustive patterns in function subcombina 

魔女パターンイムが不足しているの?

説明する機能:

COMBINA(マージ)は、それらのいずれかの空の場合、他の結果、タプルのリストのタプルを受け取ります。 次に、タプルの左リストの場合は、要素とテールで最初のタプルを取得し、右タプルについては、この値と0を使用してsubcombina(submerge)を呼び出します。

subcombinaはタプルあたりの整数値

左タプルの頭の左の値が右タプルの頭の左の値より大きい場合は、タプルを返します(左タプルの頭の最初の値、max(tuple1、int1)(tuple2、int2) )親と同じ整数を持つ親右タプル側の親と右のリストを持たない左のリストを持つサブコンビナへの再帰呼び出しと連動します。 上記と似ていない場合。

私はその説明がうまくいきたいと思います。

+1

のような例の世話をするのを忘れているということです。関数の説明はコードの言い換えに過ぎず、次にコンテキスト(何を達成しようとしていますか)で説明を与えて、その例を2つに振ってみましょう。 – epsilonhalbe

+1

'-Wall'で警告を有効にすることを強くお勧めします。これは、コンパイル時にこれらの問題を検出するのに役立ちます。 – chi

+0

@epsilonhalbeスカイライン問題のアルゴリズムを解いているhttp://www.geeksforgeeks.org/divide-and-conquer-set-7-the-skyline-problem/#disqus_threadこれはマージ関数です – colymore

答えて

2

あなたはリスト以外の空のタプルに

subcombina ((_:_), (_:_)) = .. 

一致にパターンマッチングされ、どのようにこのエラー/警告がわかりますと、あなたはところで

subcombina ([], something) = .. 
subcombina (something, []) = .. 
subcombina ([], []) = .. 
関連する問題