我有这些陈述:
data SL a = SR (Integer -> (a, Integer))
deriving(Show)
instance Monad SL where
return k = SR (\st -> (k, st))
xx::SL Integer
xx = return 4
然后我这样做:
let SR f = xx
现在我有:
xx :: SL Integer
f :: Integer -> (Integer, Integer)
但我不明白为什么。也许我错过了let DATACONSTRUCTOR ..
的句法意义。
你能帮忙吗?
答案 0 :(得分:8)
let SR f = xx
表示SR f
应该等于xx
。所以,
SR f = xx -- let
= return 4 -- def. xx
= SR (\st -> (4, st)) -- def. return
因此
f = \st -> (4, st) -- remove SR on both sides
,在此上下文中,由于Integer -> (Integer, Integer)
和SR :: a -> Integer -> (a, Integer)
而属于xx :: SL Integer
类型。
答案 1 :(得分:5)
let
和where
也是模式匹配,例如case
,但只有一个替代方案。例如,let
表达式:
let SR f = xx in ...
类似于以下case
表达式:
case xx of
SR f -> ...
大多数人只是使用let
和where
来执行简单的变量绑定,因此他们没有意识到它们是模式匹配。但是,变量绑定只是模式匹配的一种特殊情况(模式匹配中的标识符匹配所有内容并将值绑定到变量)。
此外,大多数模式匹配需要多个替代方案,因此let
不适用。即使您只想匹配特定的构造函数,执行不完整的模式匹配也不是一个好主意。但是,在某些情况下,一个替代方案是完全匹配,例如,元组匹配(x, y)
,或者,就像您的情况一样,只有一个构造函数的数据类型。