Frage

Gibt es eine Programmiersprache (oder Typ-System), in dem Sie die folgenden Python-Funktionen in einer statisch typisierte und typsichere Art und Weise zum Ausdruck bringen konnten (ohne Abgüsse verwenden, Runtime-Schecks usw.)?

#1:

# My function - What would its type be? 
def Apply(x):
    return x(x)

# Example usage
print Apply(lambda _: 42)

#2:

white = None
black = None

def White():
    for x in xrange(1, 10):
        print ("White move #%s" % x)
        yield black

def Black():
    for x in xrange(1, 10):
        print ("Black move #%s" % x)
        yield white

white = White()
black = Black()

# What would the type of the iterator objects be?
for it in white:
    it = it.next()
War es hilfreich?

Lösung

1 # Dies ist nicht mit einem endlichen Typ typisierbarem. Das bedeutet, dass nur sehr wenige (wenn überhaupt) Programmiersprachen der Lage sein werden, dies zu geben.

Wie Sie jedoch gezeigt haben, gibt es einen bestimmten Typ für x, die die Funktion eingegeben werden können:

x :: t -> B

Wo B ist etwas konkreter. Dies führt zu apply wird eingegeben als:

apply :: (t -> B) -> B

Beachten Sie, dass Hindley-Milner wird diese Art nicht abgeleitet werden.

2 # Dies ist leicht in Haskell zu vertreten (von links als Übung für die Leser ...)

Andere Tipps

fand ich eine Haskell Lösung für # 1 mit Rank-N -Typen (nur für GHCi)

{-# LANGUAGE RankNTypes #-}
apply :: (forall a . a -> r) -> r
apply x = x x

apply $ const 42 -- Yields 42

Wenn es um Beispiel # 1 kommt, würden Sie den Rückgabetyp Anwenden (), und dann werden alle Funktionen x, die Sie auch passieren müssen zurückkehren dies angeben. Die meisten statisch typisierten Sprachen würden, dass nicht in der Lage sein, sicher und ohne Kontrollen zu tun, als die x-Funktion können Sie in geben können, was auch immer zurück.

Beispiel # 2 die Art der Iterator-Objekte sind, dass sie Iteratoren sind. Wenn Sie meinen, was sie zurückkommen, kehren sie Iteratoren. Ich sehe nicht, warum das nicht möglich wäre, in einem statischen System, aber vielleicht bin ich etwas fehle.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top