SML конвертация парных кортежей - PullRequest
0 голосов
/ 25 марта 2012

Я пытался решить эту проблему парных кортежей, где на входе есть список кортежей, а на выходе - кортеж списков, где первый элемент каждого кортежа сгруппирован и аналогично второму (т.е. [(1, 2), (3,4), (5,6)] -> ([1,3,5], [2,4,6])).

Я думал об этомкод, но он дает мне ошибку:

 fun convert L = foldl (fn ((x,y),(u,v)) => ((u@x),(v@y)) ([],[]) L;

Есть предложения по исправлению?

Ответы [ 2 ]

3 голосов
/ 25 марта 2012

Конкатенация (@) принимает два списка, но x и y являются значениями, поэтому вам нужно заключить их в [], чтобы создать одноэлементный список:

fun convert l=foldl (fn((x,y),(u,v))=>(u@[x],v@[y])) (nil,nil) l

Вы можете использовать cons вместоконкатенация, хотя списки внутри возвращаемого кортежа перевернуты:

fun convert l=foldl (fn((x,y),(u,v))=>(x::u,y::v)) (nil,nil) l
1 голос
/ 25 марта 2012

@ объединяет списки (а x и y не являются списками).

Попробуйте (u@[x],v@[y]).

Обратите внимание, что добавление является линейным временемоперация, в то время как предварительное добавление (то есть x :: u) является константой.Как указал Алекс, это создаст ваши списки в обратном порядке, но вы можете решить эту проблему, обработав также и ваш обратный ввод - то есть, используя foldr вместо foldl.

...