Конкатенация строк со сворачиванием в SML - PullRequest
2 голосов
/ 10 октября 2010

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

fun gather ts = foldr op ^ "" ts;

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

Ответы [ 2 ]

4 голосов
/ 10 октября 2010

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

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

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

0 голосов
/ 13 октября 2010

Используйте 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
- 
...