2013-04-01 80 views
2

爲了交換列表的前兩個元素,我已經寫以下代碼:交換列表的前兩個元素,(Haskell中)

swap_first_two_elements :: [a]->[a] 
swap_first_two_elements list=case list of 
    x:y:_ -> y:x:_ 
    [x] -> Nothing 
    []-> Nothing 

然而,終端顯示所顯示的錯誤如下:

[1 of 1] Compiling Main    (test.hs, interpreted) 

test.hs:3:16: Pattern syntax in expression context: _ 
Failed, modules loaded: none. 
Prelude> 

誰願意告訴我它有什麼問題?

順便說一句,香港專業教育學院也嘗試到了最後兩個行合併爲:

​​

怎麼錯了?終端顯示:

test.hs:4:3: Parse error in pattern: [x] || [] 
Failed, modules loaded: none. 

誰願意告訴我它有什麼問題?謝謝XD

回答

7

錯誤的是,你不能在分支的結果中使用__被保留以指示未使用的變量。然而

swap_first_two_elements :: [a]->[a] 
swap_first_two_elements list = case list of 
    x:y:xs -> y:x:xs 
    [x] -> Nothing 
    []  -> Nothing 

,如果你編譯你會得到另一個錯誤:如果你想重用列表的尾部,你必須將它綁定到另一個名稱。你的案例分支返回不同類型的值。第一個分支返回[a]類型的值,但您的第二個和第三個分支返回Maybe [a]類型的值。爲了解決這個問題,你必須包裝第一支在Just(和修復您的類型簽名,以表明你正在返回Maybe [a]而不是[a]):

swap_first_two_elements :: [a] -> Maybe [a] 
swap_first_two_elements list = case list of 
    x:y:xs -> Just (y:x:xs) 
    [x] -> Nothing 
    []  -> Nothing 

最後的改進是,你可以結合你的最後兩個案例分支成一個利用一切後備模式匹配:

swap_first_two_elements :: [a] -> Maybe [a] 
swap_first_two_elements list = case list of 
    x:y:xs -> Just (y:x:xs) 
    _  -> Nothing 
+0

THX的男人,我已經解決了我的錯誤,不做任何變更錯誤「XXX」,所以一切都是固定的,感謝ü如此多的XDD – libra

+2

你歡迎!我建議你稍後嘗試'Maybe'方法。 Haskell有很多很好的工具來處理'Maybe's內部的值,所以你不會因爲保持它而丟失任何東西。 –

+0

順便說一句,最後一個問題要問,因爲你在最後一段代碼的末尾留下了「_ - > Nothing」,是因爲Haskell的順序規則讓x:y:xs在「_-> Nothing」之前? ?,那麼'_-> nothing'將不包含'x:y:xs'這個例子嗎? – libra