2017-02-14 7 views
5

크기 (minBound, maxBound)와 다양한 정수형의 "10 진수 표현"길이를 확인하는 동안 이상한 동작이 발생했습니다. GHCi를 사용ghci - defaulting confusion

: 나는 19를 기대할 수있는 마지막 장소에서

Prelude> :{ 
Prelude| let mi = minBound 
Prelude|  ma = maxBound 
Prelude|  le = fromIntegral $ length $ show ma 
Prelude| in [mi,ma,le] :: [Int] 
Prelude| :} 
[-9223372036854775808,922372036854775807,2] 
             ^

.

내 첫번째 추측은 maxBound() 기본값 따라서는 2 얻을 수 있다는 것입니다,하지만 난 이해하지 않는 ma는 명시 적 유형 약어 (:: [Int])에 의해 Int을해야하기 때문에 -해야 ma라는 이름의 모든 기호와 참조 투명성에 의해 같은.

위의 문장을 파일에 넣은 다음 GHCi로로드하면 올바른 결과를 얻을 수 있습니다.

그럼 왜 잘못된 결과가 나옵니까?

+0

내가 첫 번째 추측은'ma' ', 아주 가까이 생각 GHCi에서 수동으로 monormorphism 제한을 켜 입력 Int이 될 수 있습니다 'le'는'ma :: Bounded a => a'를 사용하여 쇼에서'()'를 기본값으로 사용합니다. 'ma = maxBound :: Int'를 다시 사용하면 19를 얻을 수 있습니다. – jkeuhlen

+1

어떻게 타입이 고정되지 않을 수 있습니까? – epsilonhalbe

+0

반대의 동작이 예상되는 경우 모든 동작이 혼란 스러울 수 있습니다. –

답변

13

혼란스럽게도 이는 여전히 놀고있는 monomorphism 제한 (또는 GHCi의 경우 부족함)입니다. 대신 그들은 mi, ma :: Bounded a => a으로 일반 머물면서 a 변수가 한 번 두 번

  • 의 인스턴스를 가져옵니다 - GHCi는 그들이 생각으로 단사 사상 제한이 Int에 전문 얻을하지 않습니다 mima의 당신의 정의를 사용할 수 없기 때문에 당신이를 원하는 경우 fromIntegral $ length $ show ma에서 ()[mi,ma,le] :: [Int]

에서

  • 번으로 Int (당신은 관찰,이 기본입니다) 649,969,333,210 및 ma 실제로 같은 직접

    Prelude> :{ 
    Prelude| let mi, ma :: Int 
    Prelude|  mi = minBound 
    Prelude|  ma = maxBound 
    Prelude|  le = fromIntegral $ length $ show ma 
    Prelude| in [mi,ma,le] 
    Prelude| :} 
    [-9223372036854775808,9223372036854775807,19] 
    

    로 주석 또는

    Prelude> :set -XMonomorphismRestriction 
    Prelude> :{ 
    Prelude| let mi = minBound 
    Prelude|  ma = maxBound 
    Prelude|  le = fromIntegral $ length $ show ma 
    Prelude| in [mi,ma,le] :: [Int] 
    Prelude| :} 
    [-9223372036854775808,9223372036854775807,19] 
    
  • +0

    이것이'MonomorphismRestriction'으로 인한 것일 수도 있다고 생각했지만'-XNoMono ... '시도 - GHCi의 기본 설정이며 다시 잘못된 결과가 나타남 – epsilonhalbe

    +3

    @epsilonhalbe 이것은 유일한 질문 중 하나입니다. 그래서 누군가가 실제로'MonomorphismRestriction'을 (다른 방향과는 반대로) 갖고 싶었던 곳에 대답했다. :) – Alec

    +0

    좀 더 일반적인 서명을 제공하거나 명시 적으로 함수를 사용하지 않는 한 (즉,'='왼쪽에 인수가 있습니다.) 단원 제한은 일반적으로 좋은 아이디어입니다.), 당신은 아마도'let' 바인딩이 다형성이 될 것이라고 기대하지 않을 것이다. 이 경우, 당신은'mi' 나'ma'가이 때문에 다형성이되는 것을 기대하지 않습니다. – Alec