gpt4 book ai didi

Haskell 引用类型变量

转载 作者:行者123 更新时间:2023-12-03 22:22:02 25 4
gpt4 key购买 nike

我偶尔会遇到这个问题,最后想问一下是否有共同的解决方案或模式。 是否可以使嵌套上下文中的类型变量引用外部上下文中的类型? 例如,

foo :: a -> ... -> ..
foo = ...
where bar :: a -> ...

现在 bara不同于 foo 的 a .通常这是我想要的,但有时它会让生活变得困难,我需要让它们保持相同。我过去曾使用过肮脏的技巧来强制类型检查器将两者统一起来,但偶尔会受到挫败。这是我的最新示例(Parsec 函数),它促使我最终提出这个问题。
data Project = ... deriving Enum
data Stuff = ...

pProject :: Monad m => P m Stuff
pProject = do
stuff <- pStuff
...
convert stuff <$> pEnum :: P m Project

pEnum :: (Monad m, Enum a) => String -> P m a
pEnum = ...
convert函数需要一个类型,因此我必须指定注释 :: P m Project .
但是,这意味着我还必须介绍 m ,不幸的是不一样 m就像在函数签名中一样。类型检查器通过以下方式报告:

Could not deduce Monad m1 arising from a use of pEnum from the context Monad m



有没有办法引用函数签名的m没有一些丑陋的黑客? (一个丑陋的黑客会插入没有被执行的虚拟代码,但只是为了统一这两种类型而存在。)

最佳答案

您正在寻找 ScopedTypeVariables 扩展,它允许您从包含范围引用类型变量。

{-# LANGUAGE ScopedTypeVariables #-}

为了向后兼容,它仅适用于具有显式 forall 的类型签名。 .所以你必须写:
pProject :: forall m. Monad m => P m Stuff

之后,您就可以引用正确的类型变量 m pProject范围内.

关于Haskell 引用类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27326941/

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