2011-02-03 4 views
1
m = [[1,0,0],[2,-3,0],[4,5]] 
t [email protected](x:xs) = let (m, n) = (length all, length x) in all (==n) (map length all) 

명령 :"all"이 "예상 유형과 일치하지 못했습니다"라는 이유가 무엇입니까?

t m 

이 제공 :

Couldn't match expected type `(Int -> Bool) -> [Int] -> t' 
     against inferred type `[[a]]' 
In the expression: all (== n) (map length all) 
In the expression: 
    let (m, n) = (length all, length x) in all (== n) (map length all) 
In the definition of `t': 
    t ([email protected](x : xs)) 
      = let (m, n) = ... in all (== n) (map length all) 

답변

4

기호 allt의 매개 변수로 다시 정의하는 이유가 있습니다. 따라서 로컬 all은 글로벌 all을 음영 처리하며이 오류가 발생합니다. 해결책으로 로컬 all에 다른 이름을 지정하십시오.

4

당신은 전체 목록에 이름 all을 결합, 그래서 전주곡 기능 all는 더 이상 볼 수 있습니다. 다른 이름을 선택하거나 [email protected]을 삭제하고 let (m, n) = (length xs + 1, ...) 또는 이와 유사한 것을 사용하십시오.

관련 검색어 : 왜 length all을 계산 하시겠습니까? 어디서나 사용하지 마십시오.

+0

나는 하스켈이 섀도 잉과는 다른 "모든 것"의 다른 의미를 이해할만큼 충분히 똑똑하다고 생각했다. 슬퍼. 고마워요. – gremo

+4

@Gremo : 잠재적으로 많은 '모두'중 어떤 것이 었는지 추측 할 수 있습니까? 하나의 이름은 한 가지를 가리키며 좋은 것입니다. 복잡성 예산에 좋고, 단순함에 좋고, 코드에 대한 추론에 좋습니다. – delnan

+0

@delnan : 숙제를 할 때 행렬 m이 유효한지 확인하려고합니다. 각 행의 열 개수는 같습니다. (m, n)은 retval이다. – gremo

관련 문제