2016-06-29 64 views
5

Dire che ho questo disco:pattern matching su due record con gli stessi campi

type alias Rec = { a : Int } 

E, per esempio, una funzione che prende due di questi e riassume i loro interi.

f: Rec -> Rec -> Int 

Questo può essere implementato utilizzando funzioni di accesso da record (vale a dire f x y = x.a + y.a), ma c'è un modo per utilizzare pattern matching per estrarre entrambi interi?

Ovviamente, questi due non funzionano perché sarebbero vincolanti due numeri diversi alla stessa variabile:

f {a} {a} = a + a 

f x y = case (x, y) of ({a}, {a}) -> a + a 

risposta

3

Non c'è modo per fare questo al momento. Non v'è motivo aliasing (as) ma funziona solo per un intero modello, quindi questo non è valido:

type alias Rec = { a : Int } 

f: Rec -> Rec -> Int 
f { a as xa } { a as ya } = xa + ya 

main = f { a = 1 } { a = 2 } 

risultati in:

Detected errors in 1 module. 


-- SYNTAX PROBLEM -------------------------------------------------------------- 

I ran into something unexpected when parsing your code! 

4| f { a as xa } { a as ya } = xa + ya 
     ^
I am looking for one of the following things: 

    a closing bracket '}' 
    whitespace 
4

Non sembra esserci alcun modo nella lingua Elm corrente . In altre lingue funzionali come ML e Haskell, si potrebbe scrivere modelli all'interno dischi come:

$ sml 
Standard ML of New Jersey v110.74 [built: Sat Oct 6 00:59:36 2012] 
- fun func {field=x} {field=y} = x+y ; 
val func = fn : {field:int} -> {field:int} -> int 
- func {field=123} {field=45} ; 
val it = 168 : int 

Si potrebbe anche fare una richiesta di funzionalità allo sviluppatore (s) di Elm - o chiedere una domanda nel community mailing list a meno.

P.S. Dopo una rapida ricerca, ho trovato un tale proposal per aggiungere la corrispondenza di tipo ML sui campi dei record in Elm, ma sembra che sia stato disattivato. :-(