2014-10-07 49 views
0

我的功能:故障基本情况哈斯克尔

type Block = [Maybe Int] 

checkBlock' :: Block -> Block 
checkBlock' (r:rs) 
    | r == [] = [] 
    | isJust r == True = r:checkBlock' rs 
    | isNothing r == True = checkBlock' rs 

checkBlock :: Block -> Block 
checkBlock (r:rs) 
    | r == [] = [] 
    | isNothing r == True = r:checkBlock rs 
    | isJust r == True = checkBlock rs 

我想第1功能检查就INTS和空话的列表,只有返回刚才值。而第二个函数只返回Nothings。

他们搜集精而不basecase其中r == [] = [],但它我得到的错误:

Sudoku.hs:104:12: 
    Couldn't match expected type `Maybe Int' with actual type `[t0]' 
    In the second argument of `(==)', namely `[]' 
    In the expression: r == [] 
    In a stmt of a pattern guard for 
        an equation for checkBlock': 
     r == [] 
Failed, modules loaded: none. 

我可以把那里,而不是[],使这个编译?我没有想法。

回答

2

你应该使用模式匹配在这里,而不是后卫:

checkBlock :: Block -> Block 
checkBlock [] = [] 
checkBlock (r:rs) 
    | isNothing r == True = r:checkBlock rs 
    | isJust r == True = checkBlock rs 

,或最好:

checkBlock :: Block -> Block 
checkBlock [] = [] 
checkBlock (Nothing : rs) = Nothing : checkBlock rs 
checkBlock (Just _ : rs) = checkBlock rs 
+0

神感谢,emberrasing! – Rewbert 2014-10-07 15:13:13

+1

@Rewbert另请注意,'x == True'与'x'完全相同。你应该只有'| isNothing r = r:checkBlock rs',对于下一行也是类似的。 – bheklilr 2014-10-07 15:14:09

+1

'checkBlock = filter isNothing' – 2014-10-07 15:18:59

1

你不能空单比较r,你只能比较完整列表。

作为替代方案,你可以写

checkBlock :: Block -> Block 
checkBlock rs 
    | rs == [] = [] 
    | isNothing (head rs) == True = (head rs):checkBlock (tail rs) 
    | isJust (head rs) == True = checkBlock (tail rs) 

其次,警卫已经使用Bool,所以== True是不必要的。顺便说一下,尝试使用null rs istaed的rs == []

checkBlock :: Block -> Block 
checkBlock rs 
    | null rs    = [] 
    | isNothing (head rs) = (head rs):checkBlock (tail rs) 
    | isJust (head rs)  = checkBlock (tail rs) 

但是,这看起来有点丑,让我们使用模式匹配:

checkBlock :: Block -> Block 
checkBlock [] = [] 
checkBlock (r:rs) 
    | isNothing r = r:checkBlock rs 
    | isJust r  = checkBlock rs