목록

2016-09-07 8 views
1

나는 다음과 같은 데이터 유형이 있습니다목록

{-# LANGUAGE ExistentialQuantification #-} 
{-# LANGUAGE ExtendedDefaultRules #-} 

class ToString a where 

data M = forall a. (ToString a) => B a 

가 GHCI에서 나는 문제없이 다음을 수행 할 수 있습니다

let bs = [B, B]

을하지만 수행하려고 할 경우 컴파일 된 파일에서 다음 오류가 발생합니다.

No instance for (ToString a0) arising from a use of ‘B’ 
The type variable ‘a0’ is ambiguous 
Relevant bindings include 
    bs :: [a0 -> M] (bound at src/My/Module:7:1) 

내가 누락 된 확장 프로그램은 그림과 같이 B의 목록을 만들 수 있습니까? 또는 GHCI가 무엇을 놓치고 있습니까?

답변

4

이것은 GHCi가 단일 동체 제한을 켜지 않고 GHC (기본값)가 켜기 때문입니다.

bs의 추론 유형은 물론, 꽤 쓸모가
{-# LANGUAGE ExistentialQuantification #-} 
{-# LANGUAGE NoMonomorphismRestriction #-} 

class ToString a where 

data M = forall a. (ToString a) => B a 

bs = [B, B] 

: 다음 파일 typechecks, 증인

*Main> :t bs 
bs :: ToString a => [a -> M] 

당신은 단사 사상 제한을 해제하지 않으려면, 당신은 할 수 bs의 정의 타입 서명을 추가 : 내 문제를 해결

{-# LANGUAGE ExistentialQuantification #-} 

class ToString a where 

data M = forall a. (ToString a) => B a 

bs :: (ToString a) => [a -> M] 
bs = [B, B] 
+0

합니다. 이러한 GHC 언어 확장을 아는 것은 하나의 예술입니다 :-) – kurzweil4

+0

@ kurzweil4 : 이제는 자신의 취향에 맞는 또 다른 (독점적 인) 하스켈 컴파일러를 사용하여 상상해보십시오. – Cactus

+1

GHC가 말하고 싶습니다. "좋아, 우리는 하스켈이야."하고 끝내. 그런 다음 원하는만큼 많은 기능을 추가 할 수 있으며 일부 기존 표준에 제한되지 않습니다. 그런 다음, 그들은 "GHC Haskell"이라는 명세를 하스켈 (Haskell)로 발표 할 수 있으며, 다른 누군가가 컴파일러를 만들고자한다면, 스펙을 따라야합니다. 내가 아는 한, 그들은 유일한 (중요한) 게임이다. 아마도 이러한 모든 언어 pragma의 필요성을 제거 할 수 있습니까? – kurzweil4