2013-05-08 74 views
1

我想刪除列表中以「h」開頭的每個字符串。Haskell多維列表:初學者問題

[ 「hawrw」, 「basw」, 「HasD」, 「hgkas」] => [ 「basw」, 「HasD」]

我的代碼是:

kat (x:xs) = if head x == "h" then kat(xs) else x ++ kat(xs) 

它爲什麼不起作用?我該如何修復我的代碼?

+3

定義 「不工作」 – 2013-05-08 00:53:33

+0

:1:4: 無法比擬預期的類型'[[[字符] ]' '與實際類型'(t0,t1)' 在'kat'的第一個參數中,即'(「abc」,「hef」)' 在表達式中:kat(「abc」,「hef」) 在'it'的等式中:it = kat(「abc」,「hef」) 這就是e我得到了。 我只想檢查每個字符串的第一個元素是否爲「h」或不。 如果它是==「h」那麼我只是採取列表的其餘部分,並將其放入我的功能 如果它不是==「h」,那麼我想保留第一個字符串,並將其餘的列表。 – Valakor 2013-05-08 01:00:48

回答

4
  • 你需要一個基本情況:kat [] = []
  • "h"是一個字符串,你要比較一個字符,請使用:'h'
  • ++是字符串連接,您要創建一個列表,將其替換爲:

注:

  • head是不是安全,並會失敗,一個空字符串""。您可以使用null x進行測試。
  • 慣用的方法是使用filter,因爲你真的過濾。
  • 使用類型簽名可以及早發現錯誤並獲得更有意義的錯誤消息。
+0

謝謝我是功能編程新手。 – Valakor 2013-05-08 01:09:16

2

filterList = filter (\x -> head x /= 'h')

您的代碼不beause一個String頭工作是不是String。當您使用"h"時,這是一個Char,您的意思是僅有一個元素的String

+0

非常感謝 – Valakor 2013-05-08 01:09:35

2

迭戈的濾波器解決方案當然是首選的「現實世界」風格,但是如果您想修復您的示例,爲什麼不使用更多的模式匹配?畢竟,字符串只是列表。

kat (('h':_):xs) = kat xs 
kat (x:xs) = x : kat xs 
kat [] = [] 

另外一個不錯的方法是使用列表理解:

kat xs = [ys | [email protected](y:_) <- xs, y /= 'h']