2016-04-30 41 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