1

私はいくつかの論理的な謎を解くためにそのような機能を持っています

iloczyny は、そのような構造[((0,0),(0,1),[5,0])...] [((cords1),(cords2),[Num1,Num2])..]
kandydaciを持つリストであり、ソリューションのすべての可能な候補のpolaリストであり、マトリックス内のすべての可能な座標のリストです。
候補を1つ選択し、それを可能な候補と比較してiloczyny、要素が等しい場合は、座標を削除しpolaて関数をもう一度呼び出したいです。

 zbieraj iloczyny kandydaci pola = do
      element <- kandydaci
      (a,b,[c,d]) <- iloczyny
      guard (element == (c_n' [c,d]) && (elem a pola) && (elem b pola))
      nowa <- skasuj a b pola
      rk <- delete element kandydaci -- here is erorr 
      Couldn't match type `Integer' with `[Integer]'
      In the second argument of `zbieraj', namely `rk'
      reszta <- zbieraj iloczyny rk nowa
      return ([a,b] ++ reszta)

skasujはそのように見えますskasuj a b lista = delete b (delete a lista) 私はhaskellに精通しておらず、何が悪いのかわかりません

4

1 に答える 1

3

まず、関数の型シグネチャを書いてください。これにより、より適切なエラー メッセージが生成され、読者がコードをよりよく理解できるようになります。

ただし、エラーは、

nowa <- skasuj a b pola
rk <- delete element kandydaci -- here is erorr 

モナドバインディングx <- monadActionを使用しますが、それらは通常のletバインディングでなければなりません

let nowa = skasuj a b pola
    rk = delete element kandydaci

関数のコンパイル バージョン ( の適切な定義をc_n'含む) は次のとおりです。

zbieraj iloczyny kandydaci pola = do
      element <- kandydaci
      (a,b,[c,d]) <- iloczyny
      guard (element == (c_n' [c,d]) && (elem a pola) && (elem b pola))
      let nowa = skasuj a b pola
          rk = delete element kandydaci
      reszta <- zbieraj iloczyny rk nowa
      return ([a,b] ++ reszta)
于 2012-06-30T13:20:55.697 に答える