首页
学习
活动
专区
圈层
工具
发布

类ST封装
EN

Stack Overflow用户
提问于 2020-02-04 21:36:37
回答 1查看 71关注 0票数 6

我正在尝试使用类型系统来确保X永远不会从monad M中去掉。我希望它的工作方式类似于runST,因为它不可能混合来自不同线程的环境。

代码语言:javascript
复制
data X s = X Int
type M s = State Int

newX :: M s (X s)
newX = X <$> get

eval :: (forall s. M s a) -> a
eval x = evalState x 0

但是,以下代码不会导致类型错误:

代码语言:javascript
复制
ghci> x = eval newX
ghci> :t x
x :: X s

为什么ST monad中的类似代码会抛出错误,而我的不会?据我所知,M s a中的s应该被绑定,从而使X s中的s成为自由类型变量,从而导致类型检查器中出现错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-04 22:37:43

要强制类型抽象,必须使用datanewtype,而不是type

type同义词中未使用的参数根本不起作用:

代码语言:javascript
复制
type M s = State Int

所以这些是等价的:

代码语言:javascript
复制
newX :: M s (X s)
newX :: State Int (X s)

eval :: (forall s. M s a) -> a
eval :: State Int a -> a

eval实际上并不是更高级别的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60058614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档