我有这些陈述:
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
Run Code Online (Sandbox Code Playgroud)
然后我做:
let SR f = xx
Run Code Online (Sandbox Code Playgroud)
我现在有:
xx :: SL Integer
f :: Integer -> (Integer, Integer)
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么.也许我错过了语法的含义let DATACONSTRUCTOR ...
你能帮我吗?
let SR f = xx意味着SR f应该等于xx.所以,
SR f = xx -- let
= return 4 -- def. xx
= SR (\st -> (4, st)) -- def. return
Run Code Online (Sandbox Code Playgroud)
因此
f = \st -> (4, st) -- remove SR on both sides
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Integer -> (Integer, Integer)因为和SR :: a -> Integer -> (a, Integer)而属于某种类型xx :: SL Integer.
let并且where也是模式匹配case,但只有一个替代方案.所以例如一个let表达式:
let SR f = xx in ...
Run Code Online (Sandbox Code Playgroud)
如下面的case表达式:
case xx of
SR f -> ...
Run Code Online (Sandbox Code Playgroud)
大多数人只是使用let和where做简单的变量绑定,所以他们没有意识到它们是模式匹配.但是,变量绑定只是模式匹配的一种特殊情况(模式匹配中的标识符匹配所有内容并将值绑定到变量).
此外,大多数模式匹配需要多个替代方案,因此let不适用.即使您只想匹配特定的构造函数,执行不完整的模式匹配也不是一个好主意.但是,在某些情况下,一种替代方法是完全匹配,例如,元组匹配(x, y),或者,在您的情况下,只有一个构造函数的数据类型.
| 归档时间: |
|
| 查看次数: |
175 次 |
| 最近记录: |