1

我有这样的功能来解决一些逻辑谜题

iloczyny 是具有这种结构[((0,0),(0,1),[5,0])...] [((cords1),(cords2),[Num1,Num2])..]
kandydaci的列表,是我的解决方案的所有可能候选者的pola列表,并且是我的矩阵中所有可能坐标的列表。
我想选择一个候选人并将其与可能的候选人进行比较,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 回答