Haskell中返回State Integer ()与State Int Integer的函数差异
State类型区别与报错解析
先搞懂State s a的本质:它其实是个包装过的函数,签名是s -> (a, s)。第一个类型参数s是状态的类型,第二个a是计算结束后返回值的类型。
两种State类型的区别
State Integer ():- 状态是
Integer类型,意味着你操作的状态值是整数 - 返回值是
()(空元组,Haskell里表示“无意义返回值”),这类函数通常只负责修改状态,不需要返回额外数据
- 状态是
State Int Integer:- 状态是
Int类型,操作的状态值是Int整数 - 返回值是
Integer类型,这类函数既要处理状态,最后还要返回一个Integer类型的结果
- 状态是
你的报错原因
你写func :: Integer -> State Integer ()时用pure 0,问题出在pure的作用:在State里,pure x会生成一个不修改状态、直接返回x的计算。而你的返回值类型要求是(),但你传给pure的是0(Num类型的值),Haskell找不到()的Num实例,自然报错。
如果你的需求是把输入的Integer设置为新状态,应该用put函数:
func :: Integer -> State Integer () func n = put n
如果只是想生成一个啥也不做的State计算,就返回pure ():
func :: Integer -> State Integer () func _ = pure ()
内容的提问来源于stack exchange,提问作者amduck
相关产品推荐
相关产品推荐

