2014-04-17 3 views
1

나는 람다 미적분학을 쓰려고하는데, 교회 조건부를 쓸 수는 없습니다. 나는 아마 내가 하스켈 멍청이라고 말해야한다.교회 인코딩 (조건부)

저는 솔루션을 온라인과 그 외의 방법으로 살펴 보았습니다. 그러나 모든 유형과 다른 트릭을 도입하는 것이지만 가능한 한 원래 구문에 가깝게 유지하려고합니다. 예를 들어 :

\a.\b.a 
\a.\b.b 

경우/다른 교회를 위해 정확한 구문에 맞게 어떤 방법 :

tru :: Integer -> Integer -> Integer 
tru = \x -> \y -> x 

fals :: Integer -> Integer -> Integer 
fals = \x -> \y -> y 

main = do 
    print (tru 2 3) 
    print (fals 5 6) 

교회 부울에 대한 정확한 구문을 일치? 나는 \p.\a.\b.p a b를 복제하기 위해 노력하고있어,하지만 난 내가 잘못 모르겠어요 :

ifelse :: Integer -> Integer -> Integer -> Integer -> Integer -> Integer 
ifelse = \p -> \a -> \b -> p -> a -> b 

main = do 
    print (tru 2 3) 
    print (fals 5 6) 
    print (ifelse tru 42 58) 

답변

7

당신은

ifelse :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Integer 
ifelse = \p -> \a -> \b -> p a b 

나 또한도

ifelse = id 

뭔가를 원하는 교회 성도수는 제한적 일 수있는 정수에만 적용될 수 있다는 것을 명심하십시오. 다형성 형식을 지정하면 인코딩을 좀 더 일반화 할 수 있습니다.

-- Warning: untested 
{-# LANGUAGE RankNTypes #-} 
type Cbool = forall a. a->a->a 
tru :: Cbool 
tru = const 
fals :: Cbool 
fals = const id 
ifelse :: Cbool -> a -> a -> a 
ifelse = id 
type Cnat = forall a. (a->a)->a->a 
zero :: Cnat 
zero = \s z -> z -- const id 
-- etc 
+2

여기서 교회 숫자에 지수 연산을 수행하려면 rank-n 유형이 실제로 필요하다는 점에 유의하십시오. –

+3

@ AndrásKovács Really RankNTypes는 모든 교회 숫자에 필수적이어야합니다. 'CNum = forall c. (c -> c) -> c -> c'. 그렇지 않으면 파라 메트릭을 깨고 '-1'과 같은 OP 코드를 사용하여 교회 숫자가 아닌 것을 반환 할 수 있습니다. – jozefg

+0

감사합니다. 이것은 많은 도움이됩니다. 단지 질문 : 교회 인코딩을 사용하는 데 제한이 있습니까? 예를 들어, 그들과 함께 전체 프로그래밍 언어를 작성할 수 있습니까? 표현을 다시 최종 사용자가 읽을 수있는 것으로 변환 할 수 있다고 가정합니다. – antimatter