2010-10-10 3 views
1

Я пытаюсь объявить функцию, строковый список -> string, который со входом, например, ["Chicago","city","USA"] должен вернуть "Chicago city USA". То, что я сделал до сих пор было так:Объединение строк с помощью foldr в SML

fun gather ts = foldr op^"" ts; 

Это, кажется, несколько вдоль линий, однако проблема в том, я хотел бы включать пробелы между словами, так как эта функция будет возвращать "ChigagocityUSA".

ответ

3

Да, проблема в том, что ^ - это функция, которая для двух строк «foo» и «bar» возвращает «foobar», хотя вы хотите «foo bar».

Так что вам нужно определить функцию, которая принимает два строковых аргумента (как кортеж) и возвращает две строки с пробелом между ними (так string1^" "^string2).

Затем вы можете дать эту функцию в качестве аргумента foldr и получить нужный результат.

+0

я не могу действительно заставить его работать, я сделал новые функции весело HJ ц = п (а, Ь) => (а ^» «^ б); – user457142

+0

@user: Не уверен, что такое 'ts', поскольку вы его не используете. Вы можете просто сделать «val hj = fn (a, b) => (a ^" "^ b)' или 'fun hj (a, b) = (a ^" "^ b)', что то же самое, но короче. Тогда 'foldr hj" "ts', отлично работает. – sepp2k

+0

Ах, конечно, спасибо. Есть ли короткий путь для удаления последнего места, которое происходит? – user457142

1

Используйте hd и tl, чтобы получить значения для fold. Это позволяет избежать появления в результате символа ведущего или конечного пробела. foldl полезен, если вы хотите думать влево-вправо.

Определение:

fun gather xs = 
     foldl (fn (x,acc) => 
       acc^" "^x) (hd xs) (tl xs) 

Использование:

- gather ["what", "is", "this", "gather"]; 
val it = "what is this gather" : string 
-