Geist dieses Programm:Ist es möglich, Kirchencodierungen zu verwenden, ohne die Gleichartigkeit zu brechen?
{-# LANGUAGE RankNTypes #-}
import Prelude hiding (sum)
type List h = forall t . (h -> t -> t) -> t -> t
sum_ :: (Num a) => List a -> a
sum_ = \ list -> list (+) 0
toList :: [a] -> List a
toList = \ list cons nil -> foldr cons nil list
sum :: (Num a) => [a] -> a
-- sum = sum_ . toList -- does not work
sum = \ a -> sum_ (toList a) -- works
main = print (sum [1,2,3])
Beide Definitionen der Summe sind equational Argumentation gleich hoch. Doch die Erstellung der zweiten Definition von Werken, aber der erste nicht, mit diesem Fehler:
tmpdel.hs:17:14:
Couldn't match type ‘(a -> t0 -> t0) -> t0 -> t0’
with ‘forall t. (a -> t -> t) -> t -> t’
Expected type: [a] -> List a
Actual type: [a] -> (a -> t0 -> t0) -> t0 -> t0
Relevant bindings include sum :: [a] -> a (bound at tmpdel.hs:17:1)
In the second argument of ‘(.)’, namely ‘toList’
In the expression: sum_ . toList
Es scheint, dass RankNTypes
Pausen Argumentation equational. Gibt es eine Möglichkeit, kirchenkodierte Listen in Haskell zu haben, ohne sie zu brechen?
Ja, aber es wird hacken auf einen Compiler ... Rang-2-Typ-Inferenz ist entscheidbar, aber niemand hat es implementiert. Rank-3-Typ-Inferenz ist unentscheidbar (daher die Existenz von "Rank2Types" und "RankNTypes", obwohl sie derzeit dasselbe tun). –
Es ist sehr schwer für mich zu verstehen, was Sie mit "Gleichwertigkeitsdenken" hier meinen. Du arbeitest mit einem Isomorphismus, der ganz offensichtlich nicht die übliche Gleichheit ist. – dfeuer
@dfeuer Ich bin mir nicht sicher, ob ich weiß, was vernünftiges Denken bedeutet. Ich nahm an, es bedeutete, dass Sie immer Inline-Definitionen/Beta-Funktionen reduzieren können. – MaiaVictor