2017-11-04 4 views
2

Ich versuche, eine Funktion, die 2 Listen gegeben ('a list und 'b list) gibt eine ('a*'b) list, die es das kartesische Produkt beider Listen ist. Ich habe das versucht, aber es bekommt 'a list list statt 'a list, gleich für 'b. Also, ich frage, ob jemand mir sagen könnte, wo ich falsch liege und warum OCaml 'a list list statt 'a list fragt.Cartesian Produkttyp Fehler

let lprod l1 l2 = 
let rec aux lista la lb = 
    match la,lb with 
     [],_ -> lista 
     |ha::ta,[] -> aux lista ta l2 
     |ha::ta,hb::tb -> aux (ha,hb) la tb 
in aux ([],[]) l1 l2;; 

Antwort

1

ist es mehrere Probleme hier:

  1. Du nennst aux mit einem anfänglichen Akkumulatorwert von ([], []). Das ist ein Tupel von zwei Listen, keine Liste von Tupeln.
  2. In der letzten Mustervergleichszweig rufen Sie aux rekursiv mit (ha, hb), die ein einzelnes Tupel ist, keine Liste von Tupeln.

Was Sie wahrscheinlich wollen, ist der Anfangswert in 1 haben nur eine leere Liste, und dann das Tupel an den Akkumulator in 2 unter Verwendung von cons (::) anhängen.

Edit: Hier ist eine feste Version der jeweiligen Implementierung ab:

let lprod l1 l2 = 
    let rec aux acc la lb = 
    match la, lb with 
    | [], _ -> acc 
    | ha::ta, [] -> aux acc ta l2 
    | ha::ta, hb::tb -> aux ((ha, hb)::acc) la tb 
    in aux [] l1 l2;; 
+0

Ja ich diesen Akkumulator will, aber wie kann ich eine Liste von Tupeln stattdessen ein Tupel von Anrufliste in dem aux? –

+0

@JulioVillanueva Siehe die aktualisierte Antwort für eine funktionierende Implementierung – glennsl

+0

Dies funktioniert fast perfekt. Es gibt das Gegenteil von dem, was ich will, also habe ich: | [], _ -> rev acc, um zu bekommen, was ich brauche, danke –

Verwandte Themen