문제

이 질문은 이것에서 영감을 받았습니다 대답 다른 질문으로, 다음과 같이 정의 된 함수를 사용하여 목록에서 요소의 모든 발생을 제거 할 수 있음을 나타냅니다.

removeall = filter . (/=)

연필과 종이로 작업하십시오. filter, (/=) 그리고 (.), 함수의 유형이 있습니다

removeall :: (Eq a) => a -> [a] -> [a]

계약에 따라 정확히 기대하는 것입니다. 그러나 GHCI 6.6을 사용하면 얻을 수 있습니다

gchi> :t removeall
removeall :: Integer -> [Integer] -> [Integer]

유형을 명시 적으로 지정하지 않는 한 (이 경우 잘 작동합니다). Haskell이 기능에 대한 특정 유형을 추론하는 이유는 무엇입니까?

도움이 되었습니까?

해결책

Haskell이 기능에 대한 특정 유형을 추론하는 이유는 무엇입니까?

GHCI가 사용 중입니다 기본 유형, 가능성 세트에서보다 구체적인 유형을 추론합니다. 비활성화하여 쉽게 피할 수 있습니다 단일성 제한,

Prelude> :set -XNoMonomorphismRestriction
Prelude> let removeall = filter . (/=)
Prelude> :t removeall 
removeall :: (Eq a) => a -> [a] -> [a]

다른 팁

또한 표현식에 이름을 할당하지 않으면 TypeChecker는 유형의 기본값을 피하는 것 같습니다.

Prelude> :t filter . (/=)
filter . (/=) :: (Eq a) => a -> [a] -> [a]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top