Haskell의 클래스 인스턴스 리프팅
-
08-07-2019 - |
문제
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
제휴하지 않습니다 StackOverflow