将整数分配给Haskell中的变量

时间:2016-04-30 10:14:51

标签: haskell

对不起,这是一个初学者的问题。我只是试图让x = 5,y = 2,并在函数s中将所有其他变量设置为零。所有这些工作都是为了验证p计算5!在下面的代码中,其中p代表

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给出了模式匹配重叠。我知道这是一个非常简单的问题,但我没有太多的信息可供我解决。你能给我一些提示吗?谢谢!

3 个答案:

答案 0 :(得分:2)

你是模式匹配。这通常使用参数类型的不同值来完成。

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

这与自上而下匹配,读取“如果字符串参数为'hello',则为True”和“如果它是任意随机字符串参数(不包括'hello'),则为False”

您的匹配是重叠的,因为在这两种模式中,您指的是任意随机字符串占位符。一个恰好被称为“x”而另一个被称为“y”。

有关详细信息,请参阅this链接

答案 1 :(得分:1)

两种选择完全相同:匹配传入的任何值,并将其称为ProductDescription.html。由于第一个案例匹配任何,因此它总是成功并返回x

要做你似乎想要做的事情,你不能使用模式匹配,你需要使用相等(通过Eq类):

5

您无法模式匹配其他值,只能模式。使用let定义它们时,s :: Var -> Int s v | v == x = 5 | v == y = 3 x是值,但yx是模式(绝对匹配任何输入值)

您提到Var是y,因此如果Stringx设置为y,则无效,因为{{1}没有实例}},因此let x = 5, y = 2Num String不会是x,并且无法使用y

进行相等性测试

答案 2 :(得分:0)

目前还不清楚你要做什么,但是知道Haskell中并不存在赋值。也许你想看看

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

在这种情况下,无论你传递什么字符串,s都会返回7,即:

s "alpha" => 7
s "beta"  => 7