문제

Haskell에서 함수 화살표 유형 생성자(->)를 오른쪽 유형에만 적용하는 것이 가능합니까(예:(-> a)) 종류의 유형 생성자를 얻으려면 * -> *?

도움이 되었습니까?

해결책

아니요, 현재는 불가능합니다.Haskell의 유형 시스템에는 대부분의 경우 유용하고 편리하게 사용할 수 있는 특정 제한 사항이 있으며, 이것이 바로 그러한 제한 사항 중 하나입니다.가장 좋은 대안은 newtype을 사용하는 것입니다.

newtype FuncFlip r a = FuncFlip { unFuncFlip :: a -> r }

뉴타입은 컴파일러가 유형 검사 및 유형 지정 디스패치(유형 클래스)를 올바르게 수행하는 방법을 알 수 있도록 돕는 단순한 태그입니다.아마도 일부 유형 클래스 인스턴스를 제공하기 위해 유형 인수를 뒤집기를 원했을 것입니다.이는 해당 타입클래스의 기능을 사용하고 싶을 때마다 특정 입력을 다음과 같이 장식해야 한다는 의미입니다. FuncFlip, 특정 출력을 다음으로 장식 해제합니다. unFuncFlip.이는 원하는 것보다 약간 더 장황하지만 사용하려는 유형 클래스의 인스턴스를 명시적으로 식별해야 하기 때문에 실제로 그렇게 나쁘지는 않습니다.

다음의 인스턴스를 생성할 수 있습니다. 뉴타입 이를 위해 귀하에게 편리할 수도 있고 그렇지 않을 수도 있습니다.

instance Newtype (FuncFlip r a) (a -> r) where
  pack = FuncFlip
  unpack = unFuncFlip

추가 자료: "유형별 조합"이 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top