2016-05-21 8 views
3

Angenommen, ich habe eine kleine, etwas redundant Brückenfunktion in Frege definiertKonvertieren einer Frege Liste auf ein Java-Array

listToArray :: (PrimitiveArrayElement α) => [α] -> JArray α 
listToArray = arrayFromList 

und einige Java-Code, der eine bereits erhaltene TList<Long> an sie übergibt

TList<Long> tl_results = ... 
Long[] results = FregeStuffies.listToArray(IPrimitiveArrayElement_Long.it, Thunk.lazy(results)); 

eclipse beklagt, dass die zu FregeStuffies.listToArray gebenen Argumente sind nicht für, was es ist

listToArray(PreludeArrays.CPrimitiveArrayElement<α[],α>, Lazy<PreludeBase.TList<α>>) 

Übergebe ich falsch {context}/{instance of PrimitiveArrayElement}?

+0

Ist das irgendwie mit Java zu tun? –

+0

Frege ist "ein Haskell für die JVM". Hier übergibt Frege eine Frege-Liste an Java, die es an Frege zurückgibt, um in einem Kontext in ein Java-Array konvertiert zu werden. –

+0

@YassinHajaj stark mit Java verwandt, ja. Siehe meine Antwort. – Ingo

Antwort

2

Primitive Array-Typen erfordern eine spezielle Behandlung in Java, die auch die generische Verwendung in Frege verhindert.

Der Grund dafür ist, dass wir in Java noch keine primitiven Typen als Generika haben können. Wenn wir

static<A> ... foo(A[] arg) { ... } 

in Java haben, können wir die Variable vom Typ A mit einem primitiven Typ wie int oder long nicht instanziiert.

Das bedeutet, dass Ihre listToArray Funktion für Frege-Typen, die auf Java-primitiven Typen basieren, nicht funktionieren wird (es wird gesagt, dass solche Dinge in Java 10 unterstützt werden).

Für Arrays von primitiven Typen, müssen Sie wissen, welche Art es ist, und dann die entsprechende Methode aufrufen, in Ihrem Fall:

PreludeArrays.IPrimitiveArrayElement_Long.arrayFromList 

Beachten Sie auch, dass primitive Typen sind eingerahmt derzeit nicht explizit von Frege unterstützt. Dies liegt daran, dass diese Typen von Javas automatischem Boxing und automatischem Unboxing automatisch unterstützt werden.

Wenn Sie wirklich eine Reihe von long boxed benötigen, können Sie java.lang.Long als native Typ definieren, ist es eine Instanz von ArrayElement machen und explizite Boxen und Unboxing-Funktionen zur Verfügung stellen. Da java.lang.Long ein Referenztyp ist, gibt es keine Einschränkungen bei der Verwendung als Array-Elemente.

+0

Als eine Art Nebenfrage, wie lautet der Java-Klassenname für den '[]' -Typ? Das heißt, wenn es möglich ist, ein "IShow" für einen Listentyp zu haben, wie würde sein Name lauten? –

+0

Der Listentypkonstruktor ist 'PreludeBase.TList' – Ingo

+0

Aber der interne Name der Instanzen wäre' IShow _ [] ', was wie 'IShow_ $ lbrack $ rbrack' verfälscht wird. – Ingo