2016-06-29 40 views
5

Say mam ten rekord:Wzorzec dopasowania dwóch rekordów z tych samych dziedzinach

type alias Rec = { a : Int } 

i, na przykład, funkcję, która pobiera dwa z nich i sumuje ich całkowitymi.

f: Rec -> Rec -> Int 

ta może być zrealizowana z wykorzystaniem Akcesory rekord (tj f x y = x.a + y.a), ale czy jest jakiś sposób, aby wykorzystać wzór pasujący do wyodrębnić zarówno liczby całkowite?

Oczywiście, te dwa nie działają, ponieważ byłyby one wiążące dwa różne numery do tej samej zmiennej:

f {a} {a} = a + a 

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

Odpowiedz

3

Nie ma sposobu, aby to zrobić obecnie. Jest aliasing wzór (as), ale to działa tylko na cały wzór, więc jest nieprawidłowy:

type alias Rec = { a : Int } 

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

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

wyniki w:

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

Wydaje się, że nie ma takiego sposobu, w języku potocznym Elm . W innych językach funkcyjnych, takich jak ML i Haskell, można napisać wzory wewnątrz rekordy jak:

$ 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 

Równie dobrze można złożyć wniosek cecha autora (-ów) Elm - lub zadać pytanie w community mailing list w najmniej.

P.S. Po szybkim wyszukiwaniu znalazłem taki proposal, aby dodać dopasowanie wzorcowe podobne do ML na rekordowych polach w Wiązie, ale wydaje się, że zostało odrzucone. :-(