-1

我从口译员中得到以下片段:

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' 来自哪里?

4

2 回答 2

3

第三个参数来自Identtype 中函数的参数State

Usingtype定义了另一种类型的同义词(实际上是同义词)。换句话说,以下类型签名都是相同的:

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

(您也可以IdentStringValue替换Int以进行完全扩展。)

最后一个清楚地表明updateS可以接受 3 个参数:一个函数Ident -> Value、一对(Ident, Value)和一个Ident

于 2012-07-05T13:33:26.347 回答
3

updateS是一个接受三个参数的函数。如果State在类型签名中替换为它的定义,你会得到

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

ident'函数的第三个参数也是如此,它的类型为Ident

纵观全局,updateS将 aState和 a (Ident, Value)pair 变成新的State. 我们可以推断返回的是什么样的State。如果我们评估updateS s (ident, val),我们会得到在大多数情况下的State行为s,除了如果使用等于 的参数调用ident它,它会返回val

于 2012-07-05T13:33:39.080 回答