【问题标题】:Haskell error load module with mysqlHaskell错误加载模块与mysql
【发布时间】:2018-06-17 22:38:18
【问题描述】:

Haskell:数据库.MySQL.Base

insert_Producto  = do
    conn <- connect
    defaultConnectInfo {ciUser = "root", ciPassword = "", ciDatabase = "prueba"}
    oks <- executeMany conn "delete from producto"

加载模块:

Conexion.hs:27:5: error:
    The last statement in a 'do' block must be an expression
      oks <- executeMany conn "delete from producto"
   |
27 |     oks <- executeMany conn "delete from producto"
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

我尝试加载模块,但它标记我错误。 有谁知道这样做的正确方法是什么?

【问题讨论】:

  • “insert_Producto”和“delete from producto”有什么关系?

标签: haskell do-notation


【解决方案1】:

我的理解是这是你正在执行的代码:

import Database.MySQL.Base

insert_Producto = do
    conn <- connect (defaultConnectInfo {ciUser = "root", ciPassword = "", ciDatabase = "prueba"})
    oks <- executeMany conn "delete from producto" []

编译器抱怨是因为您在do 块的最后一行将executeMany 绑定到变量oks。如果你希望你的 do 块返回 executeMany 的输出,你可以这样做:

insert_Producto1 = do
    conn <- connect (defaultConnectInfo {ciUser = "root", ciPassword = "", ciDatabase = "prueba"})
    executeMany conn "delete from producto" []

您的代码有问题的原因是do 符号被取消为一系列绑定(&gt;&gt;=)。您编写的代码将被转换为

insert_Producto2 = connect (defaultConnectInfo {ciUser = "root"
                                               , ciPassword = ""
                                               , ciDatabase = "prueba"})
                       >>= \conn ->
                           executeMany conn "delete from producto" []
                               >>= \oks ->
                                   <???>

如您所见,最后一个 lambda 函数中没有主体,这会导致错误。我上面提出的代码块会去糖:

insert_Producto1 = connect (defaultConnectInfo {ciUser = "root"
                                               , ciPassword = ""
                                               , ciDatabase = "prueba"})
                       >>= \conn ->
                           executeMany conn "delete from producto" []

最后一个 lambda 现在有了一个完整的主体。

【讨论】:

  • 感谢您抽出宝贵的时间回答,测试 insert_Product2 时出现错误:
  • • 无法将预期类型 'IO a0' 与实际类型 '[p1] -> IO OK' 匹配• 可能原因:'execute' 应用于太少的参数do' 块:执行 conn "delete from producto" 在表达式中:do conn
  • executeMany的类型是什么?看起来它需要一个额外的列表参数,但尚未提供。
  • Esta es la sentencia: executeMany :: QueryParam p => MySQLConn -> Consulta -> [[p]] -> IO [OK]
  • 啊,好的。所以它需要一个查询参数列表。作为背景上下文:读取该类型签名的方式是最后一个 -&gt; 左侧的 3 个类型是参数,右侧的类型是返回类型。所以这个函数需要 3 个参数才能完全应用。如果您没有任何查询参数,则可以传递[]。我刚刚更新了上面的代码块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多