Haskell剩余绑定模式

时间:2012-07-05 13:22:19

标签: haskell pattern-matching

我有一个解释器的以下片段:

type Ident = String
type Value = Int
type State = Ident -> Value

iniState :: State

iniState = \ident -> error "internal error initial state"


updateS :: State -> (Ident, Value) -> State

updateS s (ident, val) ident' | ident' == ident = val
                              | otherwise = s ident'

updateS模式中的ident'来自哪里?

2 个答案:

答案 0 :(得分:3)

第三个参数是从Ident参数到类型State中的函数。

使用type定义另一种类型的同义词(完全是同义词)。换句话说,以下类型的签名都是相同的:

State -> (Ident, Value) -> State 
(Ident -> Value) -> (Ident, Value) -> (Ident -> Value)
(Ident -> Value) -> (Ident, Value) -> Ident -> Value

(您也可以将Ident替换为String,将Value替换为Int以进行完全扩展。)

最后一项明确指出updateS可以采用3个参数:函数Ident -> Value,一对(Ident, Value)和一个Ident

答案 1 :(得分:3)

updateS是一个带三个参数的函数。如果将State替换为类型签名中的定义,则会得到

updateS :: (Ident -> Value) -> (Ident, Value) -> Ident -> Value

因此ident'是函数的第三个参数,其类型为Ident

从更大的角度来看,updateSState(Ident, Value)对转换为新的State。我们可以推断出返回了什么类型的State。如果我们评估updateS s (ident, val),我们会在大多数情况下得到一个State,就像s一样,除非如果使用等于ident的参数调用它,它返回val