2015-12-20 198 views
0

Haskell中的類型問題。 我嘗試從Prolog移動到Haskel。 我必須從字符串表示中計算算術表達式。我在Haskel上編寫了與Prolog程序相匹配的遞歸算法。原因Haskel要求列表中的所有元素必須是一種類型,不可能像Prolog中那樣混合操作符號和數字,所以我使用[String]類型來表示算術表達式。爲了執行計算,必須將數字的符號表示轉換爲整型,但將結果類型推斷爲浮點型。每個操作的結果必須反向轉換爲字符串,因爲它是字符串元素的類型。Haskell編譯器(HUGS 98)阻止我的程序。 我的錯誤是什麼? 。Haskell中的函數類型

cc   :: (String b) => [String] -> b 
cc (a:"*":b:t) = cc(c:t) 
where c=show(read a * read b) 
cc (a:"/":b:t) = cc(c1:t) 
where c1=show(read a/read b) 
cc (a:"-":t) = show(read a - read(cc t)) 
cc (a:"+":t) = show(read a + read (cc t)) 
cc (a:[]) = a 
cc [] = 0 

錯誤文件:\ e3.hs:18 - 未定義類「字符串」

+2

字符串確實不是一個類。你想用'(String b)=> [String] - > b'表達什麼? –

+0

請記住,在'a:'+':b:t'中,a和b都是單個字符,所以在計算10 + 12時會遇到一些困難。 –

+0

@ n.m。 ...這不會是一個問題,因爲它不是「+」而是「+」';) – Carsten

回答

4

編譯器錯誤是因爲(String b) => ...部分在第一線這將表明String的是b約束 - 我不認爲你想在這裏表達。

如果我找到你的權利,你想要一份String的清單,並評估到Float對不對?

在這種情況下,你指望它這應該工作:

cc :: [String] -> Float 
cc (a:"*":b:t) = cc (c:t) 
    where c = show (read a * read b) 
cc (a:"/":b:t) = cc (c1:t) 
    where c1 = show (read a/read b) 
cc (a:"-":t) = read a - cc t 
cc (a:"+":t) = read a + cc t 
cc (a:[]) = read a 
cc []  = 0 

正如你可以看到我刪除了相當長的一段你read/show對作爲了他們不需要和簡化簽名頗有幾分(目前已經有評論到)

下面是一個例子:

λ> cc ["5","+","6","*","7"] 
47.0 

這似乎工作;)


PS:也注意到,你錯過了一些情況下,像在你的模式cc ["10","10"] - 也許你應該添加一個包羅萬象的,如:

cc _   = error "uh - what?" 

到最後得到的東西,如:

λ> cc ["10","12"] 
*** Exception: uh - what?