2015-10-19 4 views
1

Мне нужно написать функцию SML, которая возвращает предложение, состоящее из слов, разделенных пробелами в данном списке. Я должен использовать хотя бы одну из функций foldl/foldr/map.возвращает строку из данного списка с пробелами между словами - sml

Это то, что я писал:

fun add_spaces nil = "" 
    | add_spaces(x::xs) = foldr (fn (x,xs) => (add_spaces x)^" "^xs) x [xs]; 

add_spaces(["Testing","function","with","this","sentence"]); 

Но эта функция приносит перевернутую строку (предложение это с функцией тестирования). Я читаю в Интернете, который можно решить, перевернув список ([xs] в этом случае правильно?), Но как я могу это сделать?

Спасибо

ответ

2

Ваша функция add_spaces использует foldr в красиво запутанные, но, вероятно, непонятого образом.

Регулярное рекурсивная функция, которая не удовлетворяет критерию использования foldl/foldr/карту, есть

fun add_spaces [] = "" 
    | add_spaces [s] = s 
    | add_spaces (s::ss) = s^" "^add_spaces ss 

Аналогичная функция, опираясь на откидные для его рекурсии будет следовать шаблону,

fun add_spaces [] = "" 
    | add_spaces (s1::ss) = fold<l/r> (fn (s,res) => ...) s1 ss 

, где ... явно не относится к add_spaces. Таким образом, у вас есть как минимум два инструмента для направления заказа, в который поступают ваши товары. Одним из них является порядок, в котором вы ссылаетесь на s и res внутри анонимной функции в приведенном выше шаблоне, а другой - на ваш выбор foldl и foldr.

Также обратите внимание, что foldl и foldr пройдут список со всех сторон; соответственно слева и справа. Чтобы проиллюстрировать порядок, попробуйте и сбросьте с чем-то, что приводит к побочным эффектам, и посмотрите, какие эффекты приходят первыми:

- ​foldl (fn (s, _) => print (s^"\n"))() ["Hello", "World!"]; 
Hello 
World! 
> val it =() : unit 
- ​foldr (fn (s, _) => print (s^"\n"))() ["Hello", "World!"]; 
World! 
Hello 

 Смежные вопросы

  • Нет связанных вопросов^_^