2012-01-11 4 views
6

는 다음을 수행하는 것이 가능 : 그것은 세계를 정의하는 이해가되지 않도록범위가 지정된 유형 설명이 가능합니까?

foo = bar 
    where 
     type A = (Some, Huge, Type, Sig) 

     meh :: A -> (A, A) -> A 

는 난 단지, where 절 내에서이 사용자 정의 형식을 사용해야합니다.

+0

이것은'meh'가 다형성이 아니라고 가정하고 있다고 가정합니다. –

답변

8

이것은 불가능합니다. 함수 위에 정의하지 않는 이유는 무엇입니까? 모듈에서 내보낼 필요는 없습니다 (명시 적 내보내기 목록 만 사용하십시오).

그런데 정말로 큰 유형이 있다면, 특히 작은 부분으로 분해해야한다는 신호 일 수 있습니다. 예를 들어 많은 튜플이있는 경우 특히 그렇습니다. 데이터 유형이 더 적절할 것입니다.

8

사실, 약간 말도 하나있다, 방법은이 근사합니다 : 당신이 이미 있다면 비록

{-# LANGUAGE TypeFamilies #-} 
{-# LANGUAGE ScopedTypeVariables #-} 

foo :: forall abbrv. (abbrv ~ (Some, Huge, Type, Sig)) 
    => abbrv -> abbrv 
foo x = meh x (x, x) 
    where meh :: abbrv -> (abbrv, abbrv) -> abbrv 
     meh x y = {- ... -} 

난 정말, 단지 서명에 종류를 축약을 위해 두 개의 언어 확장을 가능하게 추천 할 수 없습니다 그것들 (또는 타입 패밀리 대신에 GADT를 사용함)을 사용하면 아무런 상처를주지 않는다고 생각합니다.

제쳐두고, 당신은 이런 식으로 당신의 유형을 리팩토링하는 것을 고려해야합니다.

+1

아주 귀여워! 범위가 지정된 유형 변수가 실제로 필요합니까? (타입 평등이 정말로 영리한 비트 인 것 같고, 그것은'meh'의 타입으로 옮길 수 있습니다.) –

+0

'RankNTypes'을 잊었습니다. – ehird

+0

@DanielWagner : 약자 trick에는 yes (등식) 제약 조건 만 필요합니다. 그러나 문제는 특히 범위가 지정된 유형에 관한 것이므로 where 절로 확장하지 않는 것이 불만족 스러웠을 것입니다. :] –

관련 문제