2016-04-30 18 views
-1

對不起,這是一個初學者問題。我只是想讓x = 5,y = 2,並將所有其他變量設置爲零。所有這些工作是驗證p計算5!在下面的代碼中,其中p代表將整數分配給Haskell中的變量

y:= 1;而¬(x = 1)do(y:= y * x; x:= x-1);

type Num = Integer 
type Var = String 
type Z = Integer 
type T = Bool 
type State = Var -> Z 

data Aexp = N Num | V Var | Add Aexp Aexp | Mult Aexp Aexp | Sub Aexp Aexp deriving (Show, Eq, Read) 
data Bexp = TRUE | FALSE | Eq Aexp Aexp | Le Aexp Aexp | Neg Bexp | And Bexp Bexp deriving (Show, Eq, Read) 
data Stm = Ass Var Aexp | Skip | Comp Stm Stm | If Bexp Stm Stm | While Bexp Stm deriving (Show, Eq, Read) 

p::Stm 

p = (Comp(Ass "y" (N 1))(While(Neg(Eq (V "x") (N 1)))(Comp (Ass "y" (Mult (V "y") (V "x")))(Ass "x" (Sub (V "x") (N 1)))))) 

s :: State {- It has to be Var -> Int-} 
s x = 5 
s y = 2 

而當我嘗試編譯這個,ghci給出模式匹配是重疊的。我知道這是一個非常簡單的問題,但我沒有太多的信息可以解決這個問題。你能給我任何提示嗎?謝謝!

+0

有什麼'Var'類型的定義平等無法進行測試? – Lee

+0

Var是字符串。對不起,我沒有說清楚。@ Lee – dajavanoob

+0

不考慮模式匹配問題,你正在執行錯誤的功能。您需要一個映射到* store *變量/表達式關聯,這些關聯可以在您的評估者遇到'Ass'語句時更改。您的評估人員將使用它來評估'V'值,方法是將它們替換爲存儲在地圖中的值。 – chepner

回答

0

這是很不清楚你想做什麼,但知道這個任務並不存在於Haskell中。也許你想看看

s string = 
    let 
    x = 5 
    y = 2 
    in 
    -- something using x and y, e.g. 
    x + y 

在這種情況下都要返回7無論什麼字符串傳遞給它,即:

s "alpha" => 7 
s "beta" => 7 
+0

對此我很抱歉。我剛剛更新了我的問題以說清楚。希望你能更好地理解這一點。我知道問題出在哪裏,但我不知道如何通過不改變條件Var - > Int來解決問題。 – dajavanoob

2

您是模式匹配。這通常是使用不同的參數類型值完成的。

didSayHello :: String -> Bool 
didSayHello "hello" = True 
didSayHello x  = False 

這種自上而下的匹配,讀「如果字符串參數是‘你好’,然後真正的」和「如果它是任何隨機字符串參數(不包括‘你好’),那麼假」

你的匹配是重疊的,因爲在這兩種模式中你指的是任何隨機的字符串佔位符。那個恰好被稱爲「x」而另一個「y」。

this鏈接查看更多細節

+0

謝謝!我知道現在的問題是什麼,但在這種情況下我不知道如何解決它(Var - > Int)。我已經更新了這個問題來說明問題。 – dajavanoob

+0

我不知道我明白你想做什麼,但是這會解決它(注意引號,也應該在每個片段之間有新行)? 單曲::瓦爾 - > Int' 單曲「X」 = 5' 單曲「Y」 = 2' – KoenP

+0

從我可以收集你想有一個查找函數,映射變量名整數值。這可以使用實際的變量名稱來完成。 s「x」= 5'和's「y」= 2'。你有什麼打算?你是否希望將「y」的值設置爲2,從而給出'(Comp(Ass「y」(N 2))(...'? – Eduard

1

的兩個備選方案都在做同樣的事情:在任何值傳遞的匹配,並調用它x。由於第一個案例匹配任何東西它總是成功並返回5

要做到你彷彿是試圖做的,你不能使用模式匹配,你需要使用等式(通過Eq類):

s :: Var -> Int 
s v | v == x = 5 
    | v == y = 3 

你不能模式對其他值匹配,只有模式。當您使用let定義他們xy是價值觀,但xy是你提到的var是一個String模式(匹配任何絕對的輸入值)

,所以如果xy設置這樣將無法正常工作let x = 5, y = 2因爲沒有實例Num String,所以xy不會String S,以及用於與Var