문제

Haskell의 클래스 인스턴스를 쉽게 "리프트"하는 방법이 있습니까?

나는 다음과 같은 유형 생성자를 통해 NUM 구조를 "리프팅"하는 일부 클래스에 대한 NUM 인스턴스를 작성 해야하는 경우가 많았습니다.

data SomeType a = SomeCons a

instance (Num a)=>Num SomeCons a where
    (SomeCons x) + (SomeCons y) = SomeCons (x+y)
    negate (SomeCons x) = SomeCons (negate x)
    -- similarly for other functions.

이 보일러 플레이트를 피하고이 NUM 구조를 자동으로 "리프트"하는 방법이 있습니까? 나는 보통 존재를 배우려고 할 때도 쇼와 다른 수업으로 이것을해야합니다. deriving(Show).

도움이 되었습니까?

해결책

일반화 된 NewType 파생 확장은 여기서 원하는 것입니다.

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Main where

newtype SomeType a = SomeCons a deriving (Num, Show, Eq)

main = do
  let a = SomeCons 2
      b = SomeCons 3
  print $ a + b

산출:

*Main> main
SomeCons 5

다른 팁

GHC는 원하는 것을 구현합니다. 파생 메카 니즘에 대한 확장. 이러한 수정은 종종 향후 표준 언어 확장에 대해 표시됩니다 ( Haskell 'Wiki)

이 확장을 가능하게하려면 다음 Pragma를 사용해야합니다.

{-# GeneralizedNewtypeDeriving #-}

그런 다음 평소와 같이 NewType 선언에서 파생물을 사용하십시오.

data SomeType a = SomeCons a deriving (Num)

일반화 된 Newtypederiving

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