2013-11-28 34 views
1

我是Haskell的新手,一般編碼,存在一些問題。函數中的非窮舉模式:將字符串轉換爲ord值列表

sti :: [Char] -> [Integer] 
sti "" = [fromIntegral (ord x)| x<-""] 

所以我試圖與上述做的是從一個字符串創建一個整數列表,例如"Hello"變得['H','e','l','l','o'],然後我把這個列表到各自的ord值從Data.Char

我的問題是,當我嘗試使用此功能時,我得到:函數sti中的非窮舉模式。這是否意味着有些情況下我無法使用字符串的ord x?如果是的話,我將如何去解決這個問題?

任何幫助,將不勝感激。

+0

'「」'是一個空字符串,你需要一個變量來代替。這個問題缺乏對問題的最低限度的理解。我建議,你首先訪問www.learnyouahaskell.com –

+1

或者,一旦你理解了這個版本,你可以使用sti = fmap(fromIntegral。ord) –

回答

2

你只處理空字符串的情況下,""。你想這樣的:

sti :: [Char] -> [Integer] 
sti xs = [fromIntegral (ord x) | x <- xs] 

xs是一個變量,將匹配任何東西,這是你在這種情況下,想要的東西。

注意,您可以使用模式匹配來實現特殊情況下,例如:

sti :: [Char] -> [Integer] 
sti "" = [1,2,3] 
sti xs = [fromIntegral (ord x) | x <- xs] 

這個函數返回輸入字符串中的字符的ASCII字符值,除了當輸入爲空字符串,在這種情況下,它將返回[1,2,3]。即使這不是你想要的,這可能是一個有用的功能。

如果你只實施特殊情況下,並留下您已爲您的函數定義沒有價值的情況下,你會如果您嘗試評估您的功能的情況下崩潰:

Prelude Data.Char> let sti "" = [fromIntegral (ord x) | x <- ""] 
Prelude Data.Char> sti "foo" 
*** Exception: <interactive>:9:5-45: Non-exhaustive patterns in function sti 
1

你'使用""就好像它是一個變量名。但是在Haskell中,它代替了空字符串。所以你的函數只定義爲空字符串,在所有其他情況下會給你非窮舉的模式錯誤。

您應該用適當的變量名稱替換它。