2015-10-29 5 views
0

Я написал функцию, которая будет перебрасывать альтернативные элементы в списке, однако я должен ее вызвать, а затем вызвать его методы (я новичок в ML, поэтому приношу свои извинения, если я использую неправильные термины). Я бы предпочел просто вызвать функцию без вызова методов внутри нее. Это то, что я должен сделать сейчас:Переверните альтернативные элементы в списке ML

(*3. Flip alternate elements in a list, if n = odd, element n remains at end*) 
fun flip nil x = x 
    | flip x nil = x 
    | flip (x::xs) (y::ys) = x::y::flip xs ys; 

fun take l = 
    if l = nil then nil 
    else hd l::skip (tl l) 

and skip l = 
    if l = nil then nil 
    else take (tl l); 

но когда я называю его поменять местами элементы, я должен назвать это:

flip (skip d) (take d); 
flip (skip e) (take e); 

Есть ли способ вызова функции как:

flip (d); 

Если я называю flip (d); сейчас, он просто печатает

val take = fn : ''a list -> ''a list 
val skip = fn : ''a list -> ''a list 

Спасибо всем заранее!

EDIT: Я должен упомянуть, d это просто список Интс:

val d = [1,2,3,4]; 

ответ

2

Предполагая, что «листать альтернативные элементы в списке» означает поворот [1,2,3,4,5,6] в [2,1,4,3,6,5] и выбрасывая последний элемент, если длина нечетная , то вы можете добиться этого путем простого сопоставления с образцом в одной функции:

fun flip (x::y::xs) = y::x::flip xs 
    | flip _ = [] 

Некоторые обратной связи на ваших фрагментов кода:

  • Многие из ваших круглых скобок не нужны.
  • Не используйте hd/tl, но скорее используйте образец сопоставив.
  • Фактическое переворачивание происходит в ваших take и skip.

    Ваш flip может быть соответствующим образом называться merge.

  • Если бы это было так, для того, чтобы исправить flip поэтому он принимает только один аргумент:

    fun flip xs = merge (skip xs) (take xs) 
    

    Это очень полезно, чтобы иметь возможность создавать вспомогательные функции с большим количеством аргументов, и вызвать их.

+0

Спасибо, это в значительной степени именно то, что я искал! – hbteibet