【问题标题】:Higher-order functions and ST高阶函数和 ST
【发布时间】:2012-09-15 00:54:31
【问题描述】:

我在玩http://hackage.haskell.org/packages/archive/vault/0.2.0.0/doc/html/Data-Vault-ST.html,想写如下函数:

onVault  f = runST (f <$> Vault.newKey)
onVault2 f = runST (f <$> Vault.newKey <*> Vault.newKey)

等等。如果我用不带参数的函数替换这些函数并调用特定函数而不是 f,它可以工作,但这些高阶函数不会进行类型检查。

发生了什么,我可以解决吗?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    你需要给onVaultonVault2rank 2 types

    {-# LANGUAGE Rank2Types #-} -- RankNTypes would also work
    
    onVault :: (forall s. Key s a -> b) -> b
    onVault2 :: (forall s. Key s a -> Key s b -> c) -> c
    

    这是因为runST :: (forall s. ST s a) -&gt; a 要求传递的动作在状态线程参数s 中是多态的,这是一种用于保证纯度的类型级技巧。详情请见the ST monad article on HaskellWiki

    【讨论】:

    • 嗯...我担心它可能是这样的。似乎如果我让结果在ST 中,然后在我使用该值时调用runST,那也可以。
    • @singpolyma:是的,因为这将s 上的(隐式)量词放在最外层,这使其成为可以推断且不需要扩展的正常等级1 类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2021-08-03
    相关资源
    最近更新 更多