gpt4 book ai didi

haskell - 如何在不同的类型注释中引用相同的类型变量?

转载 作者:行者123 更新时间:2023-12-04 17:47:58 25 4
gpt4 key购买 nike

说我有以下几点:

import Control.Monad.Random

foo :: IO Float
foo = fmap realToFrac getRandom

GHC 正确地提示不知道 getRandom 的类型;我可以通过这样做来解决这个问题
foo = fmap realToFrac (getRandom :: IO Double)

但是,请考虑我所拥有的情况:
foo :: (Functor m, MonadRandom m) => m Float
foo = fmap realToFrac getRandom

我不能只做
foo = fmap realToFrac (getRandom :: m Double)

我必须重复 MonadRandom约束:
foo = fmap realToFrac (getRandom :: MonadRandom m => m Double)

对于大量约束,这将导致大量额外的输入。我宁愿不必那样做。我知道我可以使用 ScopedTypeVariables :
{-# LANGUAGE ScopedTypeVariables #-}

import Control.Monad.Random

foo :: MonadRandom m => m Float
foo = do
x :: Double <- getRandom
return (realToFrac x)

但这同样冗长,而且我无法在所有这些情况下应用它。

我也知道 PartialTypeSignatures 提议。我认为这可能允许我这样做:
foo = fmap realToFrac (getRandom :: _ Double)

但我对其(长)描述的扫描并不完全清楚。不幸的是, PartialTypeSignatures尚未准备好迎接黄金时段,因此尚未包含在 GHC 的发布版本中。

我显然欢迎其他建议,但我能想到的一个解决这个问题的方法是识别 mn在下面的:
foo :: (Functor m, MonadRandom m) => m Float
foo = fmap realToFrac (getRandom :: n Double)

这种事情可能吗?

最佳答案

你的直觉是正确的:ScopedTypeVariables是这项工作的正确扩展:

{-# LANGUAGE ScopedTypeVariables #-}

import Control.Monad.Random

foo :: (Functor m, MonadRandom m) => m Float
foo = fmap realToFrac (getRandom :: m Double)

关于haskell - 如何在不同的类型注释中引用相同的类型变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26906452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com