2017-02-27 8 views
0

나는 아주 간단한 연속 함수 (단순을 위해 모나드를 사용하여 피할 수)가입력 유형을 기반으로 한 연속 함수 구현? 나는, 입력 유형에 따라 서로 다른 구현을 수행하기 위해 (sudo를 코드)과 비슷한 뭔가를 시도하고 본질적으로</p> <pre><code>data C a = C {unwrap :: (a -> a) -> a} </code></pre> <p>:

기본 솔루션을 여기에서 간과하겠습니까? 나는 연속체를 처음 사용하기 때문에 간단한 것을 간과 할 수 있습니다.

+0

'f :: a - Gadt a'가 아니며, 왜 'AInt v :: Gadt a' 또는'AString v :: Gadt a'에 대해 작동해야합니까? – jakubdaniel

답변

0

나는 here의 조언에 따라 잠재적 인 솔루션을 통해 왔어요 :이 Hole 데이터 구조 내부의 입력 유형을 포장하여 유형에 따라 특정 구현을 가능하게

newtype C r a = C {runC :: (a -> r) -> r} 

data Hole = Hole1 Int | Hole2 String | Hole3 Bool 

example :: String -> C Bool a 
example s = C $ \f -> do 
    x <- f (Hole1 22) 
    y <- f (Hole2 "string") 
    k (Hole3 False) 

cont :: Hole -> Bool 
cont (Hole1 x) = ... 
cont (Hole2 x) = ... 
cont (Hole3 x) = ... 

.

1

처음에는 런타임 유형을 테스트하기 위해 (필자가 아는 한) ::을 술어로 사용할 수 없습니다. 초 a의 매개 변수 Gadt은 완전히 유령입니다. 그게 의도 된거야? example은 다른 유형을 균일하게 처리하여 다형성이되거나 class (parametric vs ad-hoc 다형성)을 사용해야 할 수 있습니다. 당신은 뭔가를 원했을 수도 있습니다

data Gadt where 
    AInt :: Int -> Gadt 
    AString :: String -> Gadt 

data C a = C { unwrap :: (a -> Gadt) -> Gadt } 

class Ex a where 
    example :: a -> C a 

instance Ex Int where 
    example v = C ... 

instance Ex String where 
    example v = C ... 

이것은 거의 의미가 없지만 최소한 나를 타입 검사하기 때문에 여전히 의사 코드입니다.