2017-07-17 2 views
0

Ich möchte eine Funktion definieren, safeIndex dieWie findet man das k-te Element einer 'unendlichen' faltbaren Struktur in Haskell?

safeIndex :: (Foldable t, Integral i) => t a -> i -> Maybe a 
safeIndex = foldr step (const Nothing) 
    where 
    step :: Integral i => a -> (i -> Maybe a) -> i -> Maybe a 
    step x f i = if i == 0 
       then Just x 
       else f (i - 1) 

auf Foldable Arten funktioniert, aber es für unendliche Listen funktioniert nicht. Für foldr in der Mitte zu stoppen, ich denke, wir müssen feststellen, ob es nur mit dem ersten Argument von step aufhören sollte, was unmöglich scheint.

Ist es möglich, die Funktion so zu reparieren, dass sie auf unendlichen Strukturen funktioniert? Wenn nicht, welche Klassen sollten wir auf t beschränken?

+0

Warum verwenden Sie 'forall' hier? –

+0

Andernfalls wird die explizite Typ-Signatur von 'step' nicht kompiliert. Ich habe 'ScopedTypeVariable' Spracherweiterung aktiviert :) –

+0

' safeIndex [1 ..] 3' Ausgänge 'Just 4'. Es wird jedoch nicht für unendliche Snoc-Listen funktionieren, aber es ist nicht sinnvoll, dass sie von vornherein "von rechts" indexieren. –

Antwort

1

Eigentlich funktioniert die Definition in der Frage Beschreibung bereits für unendliche eingebaute Liste. Es waren einige andere Fehler, die mich denken ließen, dass es nicht möglich sei;) (Siehe die Kommentare.)

1

Wenn es Ihnen nichts ausmacht, eine Abhängigkeit zu übernehmen, die foldl library von Gabriel Gonzalez bietet index und genericIndex Falten, die Ihrem Zweck entsprechen.

Zum Beispiel Sie

safeIndex :: (Foldable f, Integral a) => a -> f b -> Maybe b 
safeIndex = fold . genericIndex 

Außerdem schreiben konnte, scheint der Code, den Sie zu tun geschrieben, was Sie beabsichtigen.

EDIT: Ich spreizte das "unendliche Listen" -Bit.

Dies funktioniert für unendliche Listen, aber ich weiß nicht, dass es eine sinnvolle Möglichkeit gibt, es für alle Foldable s zu definieren.

safeIndex' :: Int -> [a] -> Maybe a 
safeIndex' n = listToMaybe . foldr (.) id (replicate n (drop 1)) 

EDIT 2:

streich das, was Sie in der ursprünglichen Post haben sollte für jeden Foldable arbeiten.

+0

Danke! Es ist eine praktische Bibliothek, obwohl es nicht für unendliche Listen funktioniert. –

+0

Oh, mein Gott, du hast Recht. Ich habe das Bit über unendliche Listen komplett verglast. Ich werde in einer hässlicheren Idee bearbeiten. –

Verwandte Themen