haskell - 加载文件与将行粘贴到 GHCI 时类型推断不同
问题描述
我正在尝试使用Beam Haskell库。考虑以下两个片段:
版本 1:
getDb = open "shoppingcart1.db"
runDebug conn = runBeamSqliteDebug putStr conn
runDebugInDb actions = do conn <- getDb
runDebug conn actions
版本 2:
dbFile = "shoppingcart1.db"
getDb = open dbFile
runDebug conn = runBeamSqliteDebug putStr conn
runDebugInDb actions = do conn <- getDb
runDebug conn actions
我希望类型推断是相同的。但是推断的类型runDebugInDb
是不同的,即使推断的类型runDebug
和getDb
是相同的。
版本 1 的 ghci:
λ> :t (getDb, runDebug, runDebugInDb)
(getDb, runDebug, runDebugInDb)
:: (IO Connection, Connection -> SqliteM a -> IO a,
SqliteM b -> IO b)
版本 2 的 ghci:
λ> :t (getDb, runDebug, runDebugInDb)
(getDb, runDebug, runDebugInDb)
:: (IO Connection, Connection -> SqliteM a -> IO a,
SqliteM () -> IO ())
正确的行为是第一个片段,以便查询可以返回查询的结果。为了让第二个片段工作,我必须明确注释runDebugInDb
.
作为 Haskell 的新手,我不太了解类型推断系统的工作原理。为什么runDebugInDb
在这两者中推断类型不同?
更新 1:可以在此处找到一个最小示例。这也显示了已启用的扩展,它们来自 Beam 教程。
由于某种原因,行为有点不同:来自 ghci 的类型是:
运行版本 1:
λ> :t (getDb, runDebug, runDebugInDb)
(getDb, runDebug, runDebugInDb)
:: (IO Connection, Connection -> SqliteM a -> IO a,
SqliteM b -> IO b)
运行版本 2:
λ> :t (getDb, runDebug, runDebugInDb)
(getDb, runDebug, runDebugInDb)
:: (IO Connection, Connection -> SqliteM a -> IO a,
SqliteM ghc-prim-0.6.1:GHC.Types.Any
-> IO ghc-prim-0.6.1:GHC.Types.Any)
更新 2:关闭ExtendedDefaultRules
扩展允许它工作。启用MonomorphismRestriction
扩展似乎没有改变任何东西。
似乎ExtendedDefaultRules
改变了文字的解释。如果我理解正确,"shoppingcart1.db"
字符串文字会被带到runDebug
该函数中并在该函数中进行不同的解释。这是一个正确的解释吗?我如何确定这个扩展何时会产生影响?
更新 3:似乎ExtendedDefaultRules
实际上并没有改变行为。事实证明,如果我将整个文件加载到 ghci 中,而不是将行复制到 ghci 中并一个接一个地运行它们,那么行为会有所不同。如果我加载整个文件 (),则行为是我最初报告的,:l TypeInferenceExample.hs
但如果将行复制到 ghci 中,类型推断是相同的。
(我以为我ExtendedDefaultRules
在 ghci 中取消了扩展,但实际上并没有。)
解决方案
推荐阅读
- c# - 满足条件时C#linq如何从谓词列表中获取属性
- angular - 从 Nebular 窗口组件打开 Nebular 对话框
- android - 删除 @JvmSuppressWildcards 不起作用 android dagger 2.25.2
- java - 我有一个带有数字和字母的字符串,有没有办法将整数移动到一个单独的 int 变量中?
- javascript - 如果用户输入与预定义字符串匹配,则返回 true
- django - 菜单中的 Django CMS 图标
- android - 领域避免更新嵌套对象
- angular - 我需要帮助了解如何将此函数转换为流以获得响应和最新的结果
- kubernetes - Kubernetes 自动移除不再需要的资源
- testing - 在测试时模拟单个函数存在哪些模式?