는 다음을 수행하는 것이 가능 : 그것은 세계를 정의하는 이해가되지 않도록범위가 지정된 유형 설명이 가능합니까?
foo = bar
where
type A = (Some, Huge, Type, Sig)
meh :: A -> (A, A) -> A
는 난 단지, where 절 내에서이 사용자 정의 형식을 사용해야합니다.
는 다음을 수행하는 것이 가능 : 그것은 세계를 정의하는 이해가되지 않도록범위가 지정된 유형 설명이 가능합니까?
foo = bar
where
type A = (Some, Huge, Type, Sig)
meh :: A -> (A, A) -> A
는 난 단지, where 절 내에서이 사용자 정의 형식을 사용해야합니다.
이것은 불가능합니다. 함수 위에 정의하지 않는 이유는 무엇입니까? 모듈에서 내보낼 필요는 없습니다 (명시 적 내보내기 목록 만 사용하십시오).
그런데 정말로 큰 유형이 있다면, 특히 작은 부분으로 분해해야한다는 신호 일 수 있습니다. 예를 들어 많은 튜플이있는 경우 특히 그렇습니다. 데이터 유형이 더 적절할 것입니다.
사실, 약간 말도 하나있다, 방법은이 근사합니다 : 당신이 이미 있다면 비록
{-# 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를 사용함)을 사용하면 아무런 상처를주지 않는다고 생각합니다.
제쳐두고, 당신은 이런 식으로 당신의 유형을 리팩토링하는 것을 고려해야합니다.
아주 귀여워! 범위가 지정된 유형 변수가 실제로 필요합니까? (타입 평등이 정말로 영리한 비트 인 것 같고, 그것은'meh'의 타입으로 옮길 수 있습니다.) –
'RankNTypes'을 잊었습니다. – ehird
@DanielWagner : 약자 trick에는 yes (등식) 제약 조건 만 필요합니다. 그러나 문제는 특히 범위가 지정된 유형에 관한 것이므로 where 절로 확장하지 않는 것이 불만족 스러웠을 것입니다. :] –
이것은'meh'가 다형성이 아니라고 가정하고 있다고 가정합니다. –