gpt4 book ai didi

haskell - 具有 Haskeline 自动完成功能的不明确类型变量

转载 作者:行者123 更新时间:2023-12-02 16:41:31 24 4
gpt4 key购买 nike

我正在尝试使用 Haskeline 实现自动完成功能:

import System.Console.Haskeline
import System.Console.Haskeline.IO
import Data.List

mySettings :: Settings IO
mySettings = defaultSettings {
historyFile = Just "myhist"
, complete = completeWord Nothing " \t" $ return . search
}

keywords :: [String]
keywords = ["Point","Line","Circle","Sphere"]

search :: String -> [Completion]
search str = map simpleCompletion $ filter (str `isPrefixOf`) keywords

main :: IO ()
main = do
inputLine <- initializeInput mySettings
putStrLn "done"

但我对这个 GHC 错误有点失望:

Ambiguous type variable `t0' in the constraint:
(Control.Monad.IO.Class.MonadIO t0)
arising from a use of `defaultSettings'
Probable fix: add a type signature that fixes these type variable(s)

我为每个函数设置了类型,但没有解决问题。

您知道这种类型歧义从何而来以及如何消除它吗?

最佳答案

快速修复:

mySettings :: Settings IO
mySettings = (defaultSettings :: Settings IO)
{ historyFile = Just "myhist"
, complete = completeWord Nothing " \t" $ return . search }

这个问题是一个非常罕见的极端情况,因此上述解决方案看起来任意或难以理解也就不足为奇了。尽管如此,我还是尝试解释一下。

defaultSettings类型为MonadIO m => Settings m 。它是一个多态值,此类值通常会导致类型推断出现问题。一般来说,如果 GHC 可以从上下文推断多态参数,我们只能对多态值进行计算(模式匹配、场投影等)。 Settings m可能有完全不同的内容,具体取决于确切的 m以及属于 m 的确切类型类方法。

现在,Settings 的问题是m参数仅出现在 complete 中字段,其类型为 CompletionFunc m 。但在我们的示例中,我们忽略旧的 complete字段,只需将其替换为新字段即可。因此,据GHC所知,旧的complete字段可以是任何类型。又自老complete字段是我们可能获得有关 m 的信息的唯一来源。 defaultSettings的参数,并且我们完全不受约束,GHC 无法推断 mMonadIO

如果我们添加(defaultSettings :: Settings IO) ,然后是旧的m参数实例化为IO一切都不再有问题了。请注意, m参数与旧的 m 完全无关参数,因为我们只是忽略了旧的 complete字段并将其替换为新函数。新m参数确定为IO由顶层mySettings :: Settings IO注解。

事实上,我们可以实例化 defaultSettings与任何MonadIO类型,结果是一样的。同样,这是因为我们忽略了 complete 的旧值。 。

关于haskell - 具有 Haskeline 自动完成功能的不明确类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29390884/

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