我有一个解释器的以下片段:
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'来自哪里?
答案 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
。
从更大的角度来看,updateS
将State
和(Ident, Value)
对转换为新的State
。我们可以推断出返回了什么类型的State
。如果我们评估updateS s (ident, val)
,我们会在大多数情况下得到一个State
,就像s
一样,除非如果使用等于ident
的参数调用它,它返回val
。