对不起,这是一个初学者的问题。我只是试图让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给出了模式匹配重叠。我知道这是一个非常简单的问题,但我没有太多的信息可供我解决。你能给我一些提示吗?谢谢!
答案 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
是值,但y
和x
是模式(绝对匹配任何输入值)
您提到Var是y
,因此如果String
和x
设置为y
,则无效,因为{{1}没有实例}},因此let x = 5, y = 2
和Num 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