2013-04-21 263 views
1

我有一個函數foo需要一個字符。我想將該函數映射到字符串中的每個字符上。如何在SML中的字符串中映射每個字符

fun foo (ch : char) = 
    ch; 
fun bar (str : string) = 
    map foo [(str)]; 

顯然,這是行不通的,由於字符串被應用到期望一個字符的功能。所以我嘗試使用String.explode(str)將其分解成一個char數組,然後我似乎無法映射數組中的每個char並將char應用於foo函數。

fun foo (ch : char) = 
    ch; 
fun bar (str : string) = 
    map foo [(String.explode(str))]; 

如何在字符串中的每個字符上映射函數?

編輯: 我想改變富拿2個參數

fun foo(ch : char, i : int) = 
    ch; 
fun bar(str : string) = 
    map foo (String.explode(str), 1); 

但是,這給了我一個tycon不匹配

operator domain: (char * int) list 
operand:   char list * int 

的是如何來到以前String.explode(STR)瞭解映射函數映射到每個字符,但現在它將其視爲一個完整的字符列表?

編輯2:沒關係,想通了。

fun bar(str : string) = 
    map (fn x => foo (x, 1)) (String.explode(str)); 
+1

如果你想避免昂貴的爆炸/破滅,你也可以使用'CharVector.map',其類型爲'(字符 - >字符) - >字符串 - > string'(HTTP:// WWW .standardml.org /基/單vector.html#MONO_VECTOR:SIG:SPEC)。 – 2013-04-21 18:52:22

回答

2

當你想map在每個字符,然後你給map列表必須是字符的列表。 explode返回一個字符列表,所以使用explode絕對是正確的想法。但是,您將由explode返回的列表放入另一個列表中,從而產生列表的列表。這就是爲什麼你會遇到類型錯誤。

只需刪除外部列表,您的代碼將按照您的意圖工作。

0
- String.map Char.succ "HAL"; 
> val it = "IBM" : string 
+0

簡短的解釋會改善這個答案。 – 2016-03-06 03:41:34

相關問題