형식이없는 언어에서도 가능하지만 반복 증분으로 추가를 정의하는 방법을 찾을 수 없습니다. 여기 내 코드입니다 : 내가 add2
얻을반복되는 증분을 사용하여 유형화 된 교회 숫자에 더하기를 구현할 수 있습니까?
{-# LANGUAGE RankNTypes #-}
type Church = forall a . (a -> a) -> (a -> a)
zero :: Church
zero = \f -> id
inc :: Church -> Church
inc n = \f -> f . n f
-- This version of addition works
add1 :: Church -> Church -> Church
add1 n m = \f -> n f . m f
-- This version gives me a compilation error
add2 :: Church -> Church -> Church
add2 n m = n inc m
컴파일 오류가
Couldn't match type `forall a1. (a1 -> a1) -> a1 -> a1'
with `(a -> a) -> a -> a'
Expected type: ((a -> a) -> a -> a) -> (a -> a) -> a -> a
Actual type: Church -> (a -> a) -> a -> a
In the first argument of `n', namely `inc'
In the expression: n inc m
In an equation for `add2': add2 n m = n inc m
입니다 왜이 오류가? 은 그 ((a->a) -> a -> a)
의 동의어가 아닙니까?
[이 최근 질문] (http://stackoverflow.com/q/23532659/791604)을 원할 수도 있습니다. –
실제로 사용하려면, 동의어를 입력하는 대신 newtype을 사용하는 것이 좋습니다. – PyRulez