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

时间:2018-08-22 22:16:17

标签: haskell newtype

newtype State s a = StateOf (s -> (s, a))

(s -> (s, a))是一个函数,不是吗?

newtype State s a = State { runState :: s -> (s, a) }这样的表达式很有意义,因为允许使用记录语法。

2 个答案:

答案 0 :(得分:2)

  

(s -> (s, a))是一个函数,不是吗?

不确定是否能回答您的问题,但是:从技术上讲(s -> (s, a))不是函数,它是函数类型。即,其值为函数的类型。因此,State是一种新类型,其值在内部作为函数给出(但从外部看,它们只是“某些不透明的命名类型的值”)。

答案 1 :(得分:1)

函数也是值。至于定义类型,记录语法只是提供了一个快捷方式

newtype State s a = StateOf (s -> (s, a))

runState :: State s a -> s -> (s, a)
runState (StateOf f) = f

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