newtype State s a = StateOf (s -> (s, a))
(s -> (s, a))
是一个函数,不是吗?
newtype State s a = State { runState :: s -> (s, a) }
这样的表达式是有意义的,因为允许记录语法。
(s -> (s, a))
是一个函数,不是吗?
不确定这是否回答了您的问题,但是:从技术上讲,不,(s -> (s, a))
不是函数,而是函数类型。 即,其值为函数的类型。因此,State
是一种新类型,其值在内部作为函数给出(但从外部来看,只是"一些不透明的命名类型的值"(。
函数也是值。就定义类型而言,记录语法只是提供了一个快捷方式
newtype State s a = StateOf (s -> (s, a))
runState :: State s a -> s -> (s, a)
runState (StateOf f) = f
(记录语法还提供了其他模式匹配和值构造语法。