[Haskell-cafe] Re: Chuch encoding of data structures in Haskell

wren ng thornton wren at freegeek.org
Fri May 28 02:56:48 EDT 2010


Ivan Miljenovic wrote:
> On 28 May 2010 15:18, wren ng thornton <wren at freegeek.org> wrote:
>> Stefan Monnier wrote:
>>>> churchedBool :: t -> t -> t
>>> Important detail: the precise type is "∀t. t → t → t".
>>>
>>>> encodeBool x = \t e -> if x then t else e
>>> So the type of encodeBool should be:
>>>
>>>  Bool → ∀t. t → t → t
>>>
>>> whereas Haskell will infer it to be
>>>
>>>  ∀t. Bool → t → t → t
>>
>> Those are the same type.
> 
> I can see a slight distinction between them, based upon when the
> quantification occurs (the former returns a function that work on all
> t, the latter will do that encoding for all t).

The isomorphism in System F:

     in : (∀t. Bool → t → t → t) → (Bool → ∀t. t → t → t)
     in f = \b. /\t. f @t b


     out : (Bool → ∀t. t → t → t) → (∀t. Bool → t → t → t)
     out g = /\t. \b. g b @t


If you're using the raw System F, then there's a slight difference ---as 
there always is between isomorphic things which are non-identical--- but 
that difference is not theoretically significant. If you're using a 
higher-level language like Haskell, then the conversions are done for 
you, so there's even less difference.

The expression 1+1 is distinct from 2: it has a different representation 
in memory, it takes a different number of steps to normalize, etc. 
Sometimes these differences are important for engineering (e.g., dealing 
with space leaks), but they're rarely significant for theory.

-- 
Live well,
~wren


More information about the Haskell-Cafe mailing list