我有这样的功能来解决一些逻辑谜语
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)
我不知道哈斯克尔,也不知道什么是错的
答案 0 :(得分:4)
首先,请为您的功能编写类型签名。这将产生更好的错误消息,并帮助读者更好地理解您的代码。
然而,错误是
nowa <- skasuj a b pola
rk <- delete element kandydaci -- here is erorr
使用monadic绑定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)