2016-09-22 1 views
3

Wie schreibe ich am besten schreiben Sie eine Typ Unterschrift in Haskell, die am besten kapselt die Idee, dass eine Funktion ein Tupel beliebiger Länge mit allen Elementen X und eine Liste von Tupeln (von gleicher Länge) mit allen Elementen Y?Geben Sie sichere gleiche Tupelgrößen ein.

Es macht mir nichts aus, wenn der Typ ein "reales" Tupel ist, ein alternativer Datentyp, solange ich zur Kompilierzeit erzwingen kann, dass sowohl das Tupel als auch die Liste der Tupel dieselbe Länge haben.

+2

Langen Schuss schreiben, aber könnten Sie DataKinds benutzen, um Ihren eigenen ‚Länge indizierte Vektoren‘ zu erstellen und sie dann benutzen, um Ihre Funktionsparameter einschränken? https://downloads.haskell.org/~ghc/7.8.4/docs/html/users_guide/promotion.html – zoran119

+0

Oder verwenden Sie diese: https://hackage.haskell.org/package/fixed-list-0.1.6 /docs/Data-FixedList.html – zoran119

+0

Ich vermute, keine der beiden oben genannten sind allgemein genug :( – zoran119

Antwort

4

Wie von zoran119 vorgeschlagen, sind length-indizierte Vektoren der klassische Weg, dies zu tun.

{-# LANGUAGE GADTs, DataKinds #-} 

data Nat = Z | S Nat 

data Vec n a where 
    Nil :: Vec 'Z a 
    Cons :: a -> Vec n a -> Vec ('S n) a 

Jetzt können Sie leicht

f :: Vec n X -> [Vec n Y] -> Z 
Verwandte Themen