2017-02-03 3 views
2

Ich habe diese Funktion in Haskell, die ich in F # mit nativer Syntax und nicht die Array-Funktionen wie map2 codieren möchte.Übersetzen Merge-Funktion von Haskell zu F #

Haskell:

merge [] ys = ys 
merge (x:xs) ys = x:merge ys xs 

Dieser Code führt zwei Listen Index weise wie folgt aus:

INPUT: [1,2,3,4,5] [11,12,13,14] 
OUTPUT: [1,11,2,12,3,13,4,14,5] 

ich es in F # versuchte dabei und bekam dies aber natürlich nicht kompiliert:

let rec mux x y = function 
| [] -> [] 
| x::xs y::ys -> x::y::mux(xs,ys) 

Ich habe wirklich Mühe, mit zwei Arrays im Mustervergleich zu arbeiten, danke für jeden helfen Sie können geben.

+1

Die Haskell-Version akzeptiert zwei Parameter, Sie haben einen geschrieben, der drei akzeptiert. –

+0

Das sind Listen, keine Arrays. – ildjarn

Antwort

4

Die Haskell-Funktion stimmt nicht mit den beiden Parametern überein. Es passt nur auf den ersten Parameter und übernimmt den zweiten Parameter unverändert.

In F # können Sie auf dem ersten Argument übereinstimmt, und eine Funktion zurück, die das zweite Argument verarbeitet:

let rec mux = function 
    | [] -> (function ys -> ys) 
    | x::xt -> (function ys -> x :: mux ys xt) 

Aber ich finde es klarer (und ich denke, dass es effizienter ist - zumindest ist es in OCaml) sofort in allen anderen Argumenten zu nehmen, analysieren dann das Argument, Sie müssen diskriminieren auf:

let rec mux xs ys = 
    match xs with 
    | [] -> ys 
    | x::xt -> x :: mux ys xt 

Wenn Sie auf beiden Variablen passen wollte, würde es mehrere Lösungen sein. Sie könnten Nest function Konstrukte:

let rec mux = function 
    | [] -> (function [] -> … | y::yt -> …) 
    | x::xt -> (function [] -> … | y::yt -> …) 

Aber auch hier ziehe ich Verschachtelung match Konstrukte:

let rec mux xs ys = 
    match xs with 
    | [] -> (match ys with 
      | [] -> … 
      | y::yt -> …) 
    | x::xt -> (match ys with 
      | [] -> … 
      | y::yt -> …) 

Alternativ ist es oft schöner auf dem Paar von Eingängen zu entsprechen; Es hängt davon ab, wie stark die beiden Eingänge gekoppelt sind.

let rec mux xs ys = 
    match xs, ys with 
    | [], [] -> … 
    | [], y::yt -> … 
    | x::xt, [] -> … 
    | x::xt, y::yt -> … 
+0

Danke Gilles. Wenn ich es so machen würde wie x :: y :: mux (xs, ys) statt x :: mux ys xt, wie würde es aussehen? Dies ist aus pädagogischen Gründen, weil ich mich bemühe, die Syntax zu verstehen. – happyD

+0

@happyD Siehe meine Bearbeitung – Gilles

+0

Gilles, ich tue mein Bestes, um zu versuchen, die Lücken zu füllen, aber ich habe wirklich Probleme. Ich entschuldige mich dafür, belästigt zu werden. Mit dem Nest-Funktion-Konstrukt zum Beispiel, was würde ich an Stelle der Ellipsen setzen? Würde ich [] statt der ersten Ellipsen und ys anstelle der zweiten, xs anstelle der 3. und x :: y :: mux (xt, yt) in der 4.? – happyD