gpt4 book ai didi

haskell - GHC 类型推断问题

转载 作者:行者123 更新时间:2023-12-04 20:52:13 25 4
gpt4 key购买 nike

问题。有没有办法让这段代码在没有显式类型签名的情况下工作?

代码。首先,我有一个在实践中更好的替代 MonadTrans类,灵感来自 Data.Newtype .看起来像这样,

{-# LANGUAGE FlexibleContexts, TypeFamilies #-}

module Alt.Control.Monad.Trans where

import Control.Monad

class (Monad 𝔪, Monad (BaseMonad 𝔪)) => MonadTrans (𝔪 :: * -> *) where
type BaseMonad 𝔪 :: * -> *
lift :: (BaseMonad 𝔪) α -> 𝔪 α

然后,我有课 A用方法 foo , 如果一些基本单子(monad) MA , 然后任何转换的 monad T M也是 A .在代码中,
class A 𝔪 where
foo :: String -> 𝔪 ()

instance (A (BaseMonad 𝔪), MonadTrans 𝔪) => A 𝔪 where
foo n = lift $ foo n

但是,如果我现在想为 foo 创建快捷方式替换它的第一个参数,然后我需要一个显式的类型签名,或者编译器的上下文堆栈溢出。
minimize_call :: A 𝔪 => 𝔪 ()
minimize_call = foo "minimize"

有助于推理的可能信息。假设我们有一个关联类型 B :: * -> * .我在想我想告诉编译器 B满足 B t /= t , B (B t) /= B t等,即 B某种程度上是“单调的”——追逐关联类型等同于删除 newtype 包装器,它应该知道它不能永远删除 newtype 包装器,因此添加上下文 A到签名是必要的。

最佳答案

是的,有办法。为 A 提供接地实例, 并添加 NoMonomorphismRestriction到语言杂注(除了还必需的 FlexibleInstancesUndecidableInstances )。

但是,A类将无法使用。 编译器无法知道永远不会有 MonadTrans BaseMonad m = m 的实例.因此它永远无法选择一个实例,因为它不知道是使用这里的实例还是另一个实例。

{-# LANGUAGE FlexibleContexts, TypeFamilies, FlexibleInstances, UndecidableInstances, NoMonomorphismRestriction #-}

module Trans (MonadTrans(..), A(..), minimize_call) where

import Control.Monad

class (Monad m, Monad (BaseMonad m)) => MonadTrans (m :: * -> *) where
type BaseMonad m :: * -> *
lift :: (BaseMonad m) α -> m α

class A m where
foo :: String -> m ()


data Foo a = Bork

instance Monad Foo where
return _ = Bork
_ >>= _ = Bork

instance A Foo where
foo _ = Bork


instance (A (BaseMonad m), MonadTrans m) => A m where
foo n = lift $ foo n

-- minimize_call :: A m => m ()
minimize_call = foo "minimize"

与 ghc 6.12、7.0、7.2 和 7.4 一起编译。没有签名, minimize_call必须得到一个单态类型,除非 MR 被关闭。这无论如何都行不通,因为约束 A m不可默认。因此,必须关闭 MR。但是随后类型检查器仍然追逐自己的尾部,试图证明约束是可满足的。只有提升实例,它不能。如果你提供一个 anchor ,它可以。

但是提供类型签名要好得多。

关于haskell - GHC 类型推断问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9301989/

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