我们可以用函数声明一个新类型吗?


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

(记录语法还提供了其他模式匹配和值构造语法。

最新更新