簡體   English   中英

Haskell 解析前綴評估

[英]Haskell parsing prefix evaluation

我正在努力處理這段代碼。

import Data.Char (isDigit)
data Ast = V Int | Neg Ast | A Ast Ast | M Ast Ast deriving (Show,Eq)

parseE ("+":xs) = let (e1,r1) = parseE xs; (e2,r2) = parseE r1 in (A e1 e2, r2)
parseE ("*":xs) = let (e1,r1) = parseE xs; (e2,r2) = parseE r1 in (M e1 e2, r2)
parseE ("-":xs) = let (a,r) = parseE r in (N a, r)
parseE ("(":xs) = let (a,")":r) = parseE r in (a,r)
parseE (x:xs) = (V (read x :: Int), xs) 

eval xs = parseE xs

當我的輸入類似於: * + 1 2 * 3 + 7 - 2

我希望輸出為: ((1+2)*3)*(3*(7-2))應該顯示45

當我在 haskell 中加載我的文件時,出現此錯誤:

:load "newf.hs"
[1 of 1] Compiling Main             ( newf.hs, interpreted )

newf.hs:6:44: error: Data constructor not in scope: N :: Ast -> Ast
  |
6 | parseE ("-":xs) = let (a,r) = parseE r in (N a, r)

  |                                            ^
Failed, 0 modules loaded.

錯誤消息說數據構造函數N不在范圍內。 數據構造函數是data語句右側的東西。 在您的示例中, VNegAM是數據構造函數。 “不在范圍內”的意思是“未定義在何處使用”。

看起來你在你打算寫Neg地方寫了N ,反之亦然。 修復您的data語句以閱讀:

data Ast = V Int | N Ast | A Ast Ast | M Ast Ast deriving (Show,Eq)

允許程序編譯。

程序中仍然存在一些錯誤。 例如,以下代碼陷入循環:

> parseE (words "* + 1 2 * 3 + 7 - 2")
(M (A (V 1) (V 2)) (M (V 3) (A (V 7) (N  -- freezes

因為聲明:

let (a,r) = parseE r in (N a, r)

這引入了一個意外的遞歸定義——您將r定義為調用parseE r的結果,這會導致無限循環。 在嘗試處理括號的情況下,您會遇到類似的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM