2014-10-07 2 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 

나는 그냥 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. 

내가 거기에 배치 할 수 있습니다 대신 []이 컴파일 할을? 나는 아이디어의 ut을 실행했습니다. 바람직하게는,

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

또는 :

답변

2

현재,하지 가드와 일치하는 패턴을 사용한다

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

하나님 감사합니다, emberrasing! – Rewbert

+1

@Rewbert 또한'x == True'는'x'와 똑같습니다. 당신은'| isNothing r = r : checkBlock rs' 그리고 다음 행에 대해서도 마찬가지입니다. – bheklilr

+1

'checkBlock = 필터 isNothing' –

1

당신은 빈 목록 r을 비교할 수 없습니다, 당신은 전체 목록 만 비교할 수 있습니다.

대안으로, 당신은 너무 == True가 불필요 경비 이미 Bool를 사용하는,

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

둘째를 작성할 수 있습니다. 그런데, null rsrs == []

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

의 istaed 그러나이 조금 추한 외모 사용하려고의 패턴 매칭을 사용하자 :

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