2014-11-23 109 views
0

我想打一個程序,遞歸元組

  • 需要的性格和對字符作爲參數的清單列表上,
  • 返回對的第一個元素,如果它等於輸入字符,否則返回不變的對。

我有以下代碼:

lookUp :: Char -> [(Char, Char)] -> Char  
lookUp a [] = [] 
lookUp a [(x,y),(xs,ys)] 
    | a == x = y : lookUp [(xs,ys)] 
    | otherwise = x : y : lookUp [(xs,ys)] 

當我編譯它,我得到了很多錯誤:

無法匹配,期望與實際類型[類型「字符」 T0]

在關於 '查找'

的方程0

等等......

對不起,我對Haskell比較新。我很肯定我在用元組遞歸處理時犯了一個錯誤([(x,y),(xs,ys)]),但我不知道如何改變它。有任何想法嗎?

+0

我不太明白 - 你想要一個Chars列表嗎?你能準確地說出你想要的功能嗎? – user2008934 2014-11-23 18:01:48

+0

如果要在不同情況下返回值和對,可以將結果類型包裝在「Either」數據類型中。 – Sibi 2014-11-23 18:05:03

+0

*返回該對中的第一個元素,如果它等於輸入字符,或者返回未經修改的對。*您不能這樣做。你的結果類型不能區分一種情況('Char')和另一種情況('(Char,Char)')。請澄清你的規格。 – Jubobs 2014-11-23 18:48:03

回答

1

你的代碼將鍵入的這一修改檢查:

-- lookUp :: we'll have GHC tell us the type signature  
lookUp a [] = [] 
lookUp a ((x,y):pairs) 
    | a == x = y : lookUp a pairs 
    | otherwise = x : y : lookUp a pairs 

一些明顯的錯誤:

  • 當遞歸調用lookUp你只用一個參數來調用它(你忘了a參數)
  • 模式[(x,y),(xs,ys)]將只匹配一個正好兩對字符的列表。模式((x,y):pairs)匹配非空列表對。第一對被解構爲字符xy,列表的剩餘部分綁定到pairs

使用:t命令ghci讓GHC告訴你類型簽名是什麼。

現在是否這是你想要的是另一個問題。