2013-02-01 40 views
0

我正在編寫一個SML程序,我試圖將具有轉義序列的字符串轉換爲沒有轉義序列的字符串。如何將轉義序列轉換爲SML中相應的字符?

我已經試過這一點,但它似乎沒有工作(打印只是"Hello "

fun test x = 
let val esc = "Hello \\ Bob \n Newman" 
    val fixed = String.fromString esc 
in 
    print (valOf(fixed)) 
end 

我想我可能有但是使用String.scan功能,我完全不明白怎麼回事作品。

函數簽名是

scan  : (char, 'a) StringCvt.reader 
        -> (string, 'a) StringCvt.reader 

所以,我有幾個問題:

1)你能expalin究竟該掃描簽名是說...沒有的功能採取什麼樣的參數和哪些呢它返回

2)這是我應該使用的功能?

3)你能不能給我任何指導使用該功能。由於

編輯:好了,上面的例子中,我簡化了,但我可能有太多的簡化,這...這是我在做什麼。我有一個名爲str的全局字符串和字符串/字符串的輸入流......當我讀取輸入流時,我將str與我剛剛閱讀的字符連接起來。讀完所有字符後,我想返回str,但轉換了所有轉義序列。

+0

你期待/試圖得到什麼結果? –

+0

這個問題與函數式編程本身無關。 – pyon

+0

轉換爲「沒有轉義序列的字符串」是什麼意思? –

回答

1

我剛剛解僱PolyML和嘗試以下操作:

Poly/ML 5.5.0 Release 
> val a = "Hello \\ Bob \n Newman"; 
val a = "Hello \\ Bob \n Newman": string 
> print a; 
Hello \ Bob 
Newmanval it =(): unit 
> print (String.toString a); 
Hello \\ Bob \n Newmanval it =(): unit 
> 

換句話說,轉義序列已經默認解釋爲它們所代表的字符,你必須使用String.toString爲「UNESCAPE」特殊字符(得到一個包含原始轉義序列的字符串)。或者,更好的是,您可以使用轉義序列自己編碼轉義序列,如Andreas所示。

+0

我已經添加了對我的問題的澄清。謝謝你的幫助 –

1

看來你感到困惑逃離在你的例子發生量。

當你寫

val s1 = "Hello \n world!" 

然後逃逸已經由SML分析器解釋,s1本身將不包含任何在運行時。您可以按原樣打印字符串。

實際上包含逃逸在運行時的字符串將如be

val s2 = "Hello \\n world!" 

因爲這裏的SML解析器將\\解釋爲(單個)斜線。然後您可以在運行時使用String.fromString轉換s2,產生與s1相同的字符串。

所以回到你的榜樣,esc表示運行時字符串

Hello \ Bob 
Newman 

以斜槓後面加一個空格。這不是一個有效的轉義序列,因此String.fromString只會將字符串轉換爲「解析」錯誤(即SML中所有fromString函數的語義 - 如果直接使用底層的scan函數,還可以恢復其餘的串)。

相關問題