과 같은 재귀 적 GADT를 처리하는 방법 이것은 내가 해왔 던 Haskell 유형 시스템 확장에 가장 가깝다고 생각하며 내가 할 수 없었던 오류가 발생했습니다 알아낼. 길이에 대해 미리 사과드립니다. 제가 만들 수있는 가장 짧은 예입니다. 문제는 내가 아직도 가지고있는 문제를 보여줍니다. GADT 정의 {-# LANGUAGE StandaloneDerivi
인터넷을 통해 흩어져있는 "GADT가있는 표현식"을 사용할 때까지 GADT가 훌륭하다고 생각했습니다. 전통적인 ADT는 무료로 Eq로 간주하여 정의 평등을 제공합니다. (매우 당연하게도) 내가 얻을 data Expr a where
(:+:) :: (Show a, Eq a) => Expr a -> Expr a -> Expr a
(:-:) :
{-# LANGUAGE GADTs #-}
module Main where
data CudaExpr x where
C :: x -> CudaExpr x
Add :: Num x => CudaExpr x -> CudaExpr x -> CudaExpr x
Sub :: Num x => CudaExpr x -> CudaExpr x
유형이 포함 된 이질적 목록이 포함 된 값 유형을 반영합니다. 내가 좋아하는 것 무엇 {-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeFamilies #-}
{-#
다음 코드에서 대체 할 수있는 것은 x = ...입니다. a에 클래스 제한을 넣고 싶지는 않습니다 (물론 은 이미 Bool 일 수 있으므로 두 가지 유형 중 하나만 사용할 수 있음). {-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
data D (a :
다음은 GADT 's의 Simon Peyton-Jones가 작성한 this lecture입니다. data T a where
T0 :: Bool -> T Bool
T1 :: T a
를 그리고 요구되는 문제는 다음과 같은 기능의 유형입니다 무엇 :이 다음 데이터 형 선언 나에게 f x y = case x of
T0 _ -> T
내가 그것을 위해, 나는 다음과 같은 식을 정의 할 GADTs을 사용하고, 하스켈에서 DSL을 구축하기 위해 AST를 작성하고 있었어요 그러나 data Expr a where
I :: Int -> Expr Int
B :: Bool -> Expr Bool
Add :: Expr Int -> Expr Int -> Expr Int
GADT에서 내 머리를 감싸려고하고 있는데, 일부 마술이 계속 진행되고 있다고 생각합니다. 는 다음과 같은 고려 : class C t
data T a where
T :: (C a) => { getT :: a } -> T a
f :: C a => a ->()
f = undefined
class D t where
g :: t a
나는 다음과 같은 사용자 정의 데이터 형식이 있습니다 data FirstPair' a b = FirstPair a b deriving (Show, Ord, Eq)
type FirstPair a = FirstPair' a a
data SecondPair' a b = SecondPair a b deriving (Show, Ord, Eq)
type Sec