Hint.interpret 在用于 Polysemy.Sem 值时会给出编译器错误

2024-01-01

我正在尝试编译Polysemy https://hackage.haskell.org/package/polysemy-1.2.3.0/docs/Polysemy.html运行时使用 Hint (语言.Haskell.解释器 https://hackage.haskell.org/package/hint-0.9.0.2/docs/Language-Haskell-Interpreter.html).

当我尝试这样做时,我确实收到了有关使用不当的错误:“交互式”代码中的运算符;传递给 GHC 的文本提示似乎有语法错误。

{-# LANGUAGE DataKinds #-}

module Main where

import Polysemy (Embed, embed, runM, Sem)
import Language.Haskell.Interpreter (as, interpret, Interpreter, runInterpreter, setImportsQ)
import Data.Typeable (typeOf)
import Control.Monad.IO.Class (liftIO)

main :: IO ()
main = do
  -- Hint works fine to interpret a String:
  m <- interpretWithErrors exampleHint
  print m
  -- And Sem works fine:
  runM exampleSem
  -- But notice the weird detected type:
  print $ typeOf exampleSem
  -- And now Hint fails to interpret a Sem:
  s <- interpretWithErrors exampleBoth
  print $ typeOf s
  runM s

type MyEffect = Sem '[Embed IO] ()

exampleSem :: MyEffect
exampleSem = embed $ print "Successful Sem!"

exampleHint :: Interpreter String
exampleHint = do
  setImportsQ [("Prelude", Nothing)]
  interpret "\"Successful Hint!\"" (as :: String)

exampleBoth :: Interpreter MyEffect
exampleBoth = do
  setImportsQ [("Prelude", Nothing), ("Polysemy", Nothing)]
  liftIO $ print "Successfully imported!"
  -- This is where it fails:
  s <- interpret "embed $ print \"Success!\"" (as :: MyEffect)
  liftIO $ print "Successfully interpreted!"
  return s

interpretWithErrors :: Interpreter a -> IO a
interpretWithErrors i_a = do
  e_e_a <- runInterpreter i_a
  either (ioError . userError . show) (return) e_e_a

运行上面的打印:

"Successful Hint!"
"Successful Sem!"
Sem (': ((* -> *) -> * -> *) (Embed IO) ('[] ((* -> *) -> * -> *))) ()
"Successfully imported!"
Hint-Polysemy: user error (WontCompile [GhcError {errMsg = "<interactive>:3:41: error: Operator applied to too few arguments: :"}])

一些注意事项:

  • 我正在使用 cabal,为了通过import解释器 monad 中的行我必须从 cabal 沙箱 shell 中运行它,因为 Polysemy 没有安装到我的机器上。
  • 也就是说,我不认为阴谋集团或进口一词多义是问题所在。如果我只是忽略导入 Polysemy 并且只是setImportsQ [("Prelude", Nothing)].
  • 我正在解释的字符串甚至不需要是有效的表达式;我可以在其中添加胡言乱语而不改变错误。这向我表明问题出在(as :: MyEffect).
  • 我包括typeOf证明MyEffect事实上是Typeable.
  • 我不知道为什么typeOf exampleSem给出了如此长而奇怪的类型签名。我确实认为这在某种程度上是问题所在。重新排列MyEffect to type MyEffect = Sem ((Embed IO) : []) ()没有影响。

如果我做错了什么,任何人都清楚吗?我应该如何尝试调试这个问题?
假设这是提示、一词多义或(不太可能)中的错误Type.Reflection.Typeable https://hackage.haskell.org/package/base-4.12.0.0/docs/Type-Reflection.html#t:Typeable,我的下一步将尝试修复它?我想我必须以某种方式确定哪个库有问题?

这是对先前问题的改进。这是原文。 https://stackoverflow.com/questions/59446654/debug-ghc-compilation-error-returned-at-runtime-by-hints-language-haskell-inte


不是答案,但我发现了一些可能对您有用的发现。

我认为这可能是伪造的前缀类型运算符语法': x xs这不是有效的 Haskell(你必须将其写为 infix 或使用(':))。所以我实现了一个SemWorkaround使用的包装模块Cons and Nil而不是标准列表语法。看起来几乎是同样的问题,但有更详细的错误消息(嗯)。

然后我认为这可能是显式类型的应用程序,因为错误消息一直在谈论给予太多参数的事情。因此,我尝试将类型级列表表示更改为我们过去使用的方式。

{-# LANGUAGE DataKinds, TypeOperators, TypeFamilies #-}

module SemWorkaround where

import Polysemy (Sem, Embed)
import Data.Kind (Type)

data Nil 
data Cons (a :: (Type -> Type) -> Type -> Type) (as :: Type)

type family ListToList xs where
    ListToList Nil = '[]
    ListToList (Cons x xs) = x ': ListToList xs

newtype Sem' l a = Sem' { getSem' :: Sem (ListToList l) a }

并使用过Sem'整理提示边界。例如。

type MyEffect' = Sem' (Cons (Embed IO) Nil) ()

...

s <- interpret "Sem' . embed $ print \"Success\"" (as :: MyEffect')
pure $ getSem' s

这奏效了。因此,似乎生成该类型的人正在为多态提升构造函数发出显式类型参数,但消费者希望它是隐式的。为了确认我更改了解决方法模块以使用单态数据类型List.

data List
    = Nil
    | Cons ((Type -> Type) -> Type -> Type) List

这又起作用了。

最后,我测试了中缀问题,只是为了确定,将其更改为:

data List
    = Nil
    | ((Type -> Type) -> Type -> Type) ::: List

令我惊讶的是,failed与您熟悉的错误消息Operator applied to too few arguments。所以看来你已经找到了two错误。有人应该理解多类但有人不理解类型运算符。我还没有深入挖掘,无法找出谁错了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hint.interpret 在用于 Polysemy.Sem 值时会给出编译器错误 的相关文章

  • 如何在Haskell中实现词法分析器和解析器

    我在这里得到了这段代码 它是用Haskell结构的命令式编程语言编写的程序 所以问题是 我如何为这种语言实现词法分析器和解析器 该程序被定义为一系列语句有 6 种类型 goto write stop if goto 和 int int n
  • 如何在haskell中用另一个字符串替换一个字符串

    我想用不同的字符串替换输入文件中的字符串 我正在寻找一种方法 但似乎我只能逐个字符地更改字符串 例如在我下面的代码中 replace String gt String replace replace x xs if x then y rep
  • Haskell 点运算符

    我尝试在 Haskell 中开发一个简单的平均函数 这似乎有效 lst 1 3 x fromIntegral sum lst y fromIntegral length lst z x y 但是为什么下面的版本不行呢 lst 1 3 x f
  • Data.Array 有多快?

    The 文档 http haskell org ghc docs latest html libraries array 0 3 0 3 Data Array html of Data Array reads Haskell 提供了可索引数
  • Haskell 中的所有内容都存储在 thunk 中吗,甚至是简单的值?

    以下值 表达式 函数的 thunk 在 Haskell 堆中是什么样子的 val 5 is val a pointer to a box containing 5 add x y x y result add 2 val main prin
  • 你将如何在 Haskell 中(重新)实现迭代?

    iterate a gt a gt a gt a 你可能知道 iterate是一个接受函数和起始值的函数 然后它将函数应用于起始值 然后将相同的函数应用于最后的结果 依此类推 Prelude gt take 5 iterate 2 2 2
  • Haskell 中多核编程的现状如何?

    Haskell 中多核编程的现状如何 现在有哪些项目 工具和库可用 有哪些经验报道 2009年至2012年期间 发生了以下事件 2012 从 2012 年开始 并行 Haskell 状态更新开始出现在并行 Haskell 摘要 http w
  • 由于垃圾收集,Haskell 程序中会出现多长时间的暂停?

    关于我的另一个问题Haskell 集合可以保证每个操作的最坏情况范围 https stackoverflow com q 12393104 1333025 我很好奇 垃圾收集会导致多长时间的暂停 Haskell 是否使用某种增量垃圾收集 以
  • C++ 仪器(诊断)库

    我正在考虑向我的应用程序添加代码 以收集诊断信息以供以后检查 是否有为此目的创建的 C 库 我想做的与分析类似 但又不一样 因为收集的数据将更多地用于调试而不是分析 EDIT 平台 Linux要收集的诊断信息 由应用程序逻辑 各种断言和统计
  • Haskell数据类型转换问题

    我目前正在学习 Haskell 并且一直在编写一些非常简单的程序来练习 我的程序之一是 import System IO main do putStrLn Give me year y lt getLine let res show cal
  • 使用默认值压缩而不是删除值?

    我正在 haskell 中寻找一个函数来压缩两个长度可能不同的列表 我能找到的所有 zip 函数都只是删除列表中比其他列表长的所有值 例如 在我的练习中 我有两个示例列表 如果第一个比第二个短 我必须用 0 填充 否则我必须使用 1 我不允
  • Haskell Cabal:“包间接依赖于同一包的多个版本”

    清除我的所有后cabal installed 包 我运行了以下会话 cabal update Downloading the latest package list from hackage haskell org james bast c
  • 如何测试自定义 StateT 的 Monad 实例?

    我正在学习 Monad Transformers 其中一个练习要求实现 Monad 实例StateT 我想使用以下方法测试我的实现是否符合 Monad 法则validity https github com NorfairKing vali
  • Haskell 为替代的 Either 数据类型定义 Functor 实例

    通过 Typeclassopedia 获得一些使用类型类的路由 想要替代Either的一个实例Functor 但即使检查定义Either作为一个例子Functor总是给我带来麻烦 有这个 但不会编译 data Alt a b Success
  • 在ghci中,如何删除现有的绑定?

    我收到一个 绑定影响现有绑定 错误 类似于以下错误this https stackoverflow com questions 2902716 in haskell what does it mean if a binding shadow
  • Cabal 无法安装依赖项,但如果直接询问可以安装它们

    我发现 Cabal 反复出现一个非常奇怪的问题 它影响了我获得可重复的 Haskell 构建的能力 我有一个带有沙箱的阴谋集团项目 如果我做cabal install 我收到以下形式的错误 Y failed during the build
  • 为什么 GHC 在这里推断出单态类型,即使禁用了单态限制?

    这是由解析 f f pure 的类型 https stackoverflow com questions 55388119 resolving the type of f f pure 55388309 noredirect 1 comme
  • 函数式语言与语言实现的角度有何不同

    出现了全新的 函数式编程 范式 与过程式编程相比 它需要彻底改变思维模式 它使用高阶函数 纯度 单子等 我们通常在命令式和面向对象语言中不会看到这些 我的问题是如何执行这些语言与命令式或面向对象语言的不同之处在于 例如内存管理或指针等内部结
  • 当约束成立时,将没有约束的 GADT 转换为另一个有约束的 GADT

    我们能否将构造函数没有给定约束的 GADT 转换为具有上述约束的 GADT 我想这样做是因为我想要深度嵌入箭头并用 目前 似乎需要的表示做一些有趣的事情Typeable 一个理由 https stackoverflow com a 1223
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s

随机推荐

  • 使用 JavaScript 访问本地文件

    是否有使用 JavaScript 完成的本地文件操作 我正在寻找一种无需安装足迹即可完成的解决方案 例如要求Adobe AIR http en wikipedia org wiki Adobe Integrated Runtime 具体来说
  • 如何使用切换功能对条形图自动排序

    我上传了一个block https bl ocks org LemoNode 73dbb9d6a144476565386f48a2df2e3b FIXED 您可以在其中切换排序功能 我现在想添加的是某种if当复选框打开时 我希望条形图在您更
  • Windows 窗体中的选项卡索引

    在我当前的应用程序中 我有一个表单 要求用户输入大量数据 大约有 30 个文本框 在开发过程中有时会引入新的文本框或淘汰旧的文本框 我的客户的一项要求是 它们都可以通过按 Tab 进行导航 因此 如果我正确地看到这一点 我目前将受到 Tab
  • org.springframework.beans.factory.CannotLoadBeanClassException:找不到类

    我将 Tomcat 6 0 安装目录中的 j2ee jar 替换为 servle api com 这会产生以下错误 我目前正在尝试找出原因 可能是什么问题 我在配置文件中定义了一个 bean Sempedia service xml 如下
  • 如何使用 PHP Curl 将文件上传到 AWS 预签名 URL?

    我正在尝试使用 PHP Curl 通过预签名 URL 将文件从 上传到 AWS 虽然文件似乎已成功上传 但在下载最近上传的文件后 尝试打开新下载的文件失败 根据文件类型 我收到 此文件已损坏 或 看起来我们不支持此文件格式 或 我们无法打开
  • Android NDK R8E 缺少 stdlib.h

    我正在使用 Android NDK android ndk r8e 测试一些本机库代码 本机库是从其 makefile 构建的 而不是 Android 修改后的构建系统 使用 makefile 而不是 Android 的构建系统是项目要求
  • 无法让滚动条出现在溢出时

    我正在构建一个 MDI WEB 应用程序 并且有一个由article元素 具有header and a section对于内容 由于它是一个 MDI 应用程序 article被设定为absolute 因此它可以与其他窗口重叠 我需要一个滚动
  • android webview加载数据时闪烁一次

    我在网络视图中预加载了文本 当来自互联网的数据到来时 我用新数据重新加载网络视图 问题是在加载数据转换期间屏幕闪烁一次 有什么建议吗 尝试禁用活动的硬件加速器 android hardwareAccelerated false
  • 如何通过 pyspeech 或 Dragonfly 输入和处理音频文件以转换为文本

    我看过pyspeech和dragonfly的文档 但不知道如何输入音频文件以转换为文本 我已经尝试使用麦克风通过对它讲话并将语音转换为文本 但是如果我想输入以前录制的音频文件 谁能帮忙举个例子吗 PySpeech 和 Dragonfly 都
  • Spring-服务被eureka服务器发现后关闭

    我的服务 应用程序名称 在启动后立即意外关闭 当时 eureka服务器运行在8761端口 服务已成功被eureka服务器发现 注册状态 204 registering application with eureka with status
  • 在启动时在 Ubuntu 中设置环境变量(通过脚本)

    我想在 Ubuntu 机器 10 04 上设置几个环境变量 但我想通过脚本创建它们的值 就像 export THE ENV VAR script to execute and use stdout from 我尝试过设置 etc envir
  • 为什么 Clojure Hello World 程序与 Java 和 Python 相比如此慢?

    Update 正如许多人所建议的 这看起来是因为 clojure 代码首先被编译然后执行 AOT 编译应该有助于抵消这一点 鉴于我发现实际的 Clojure AOT 编译过程有点难以解决 类路径问题 目录问题等 我编写了一个小的逐步过程he
  • 不带 .git 文件夹的 git -- 远程 git-dir

    提出这个问题更多的是出于好奇 而不是出于任何实际目的 但是我可以有效地让我的 GIT DIR 成为 git example com repo git 吗 因此 不会有 git 文件夹 每一次提交等都会消耗网络开销 编辑 一个潜在的用例可能是
  • 何时使用字典 | (合并)与|=(更新)运算符[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 何时在字典上使用合并和更新运算符 以下示例虽然调用方式有所不同 但它们的输出是相同的 a 1 a 2 b 3 c 6 in both b 4 d
  • C/C++ 基本类型是原子类型吗?

    C C 是基本类型吗 int double等等 原子的 例如线程安全 它们是否没有数据竞争 也就是说 如果一个线程写入此类类型的对象 而另一个线程从中读取 则该行为是否明确定义 如果不是 它取决于编译器还是其他什么 不 基本数据类型 例如
  • 如何在python3中计算ANSI CRC16多项式(0x8005)?

    我尝试使用此代码计算 ANSI CRC16 多项式 0x8005 import crcmod crc16 crcmod mkCrcFun 0x8005 0xffff True 但我收到此错误消息 ValueError 多项式的次数必须为 8
  • 如何将编辑文本值传递给适配器类

    我想将下面的活动中的文本值传递给 TextAdapter 类 公共类 SecondActivity 扩展 Activity EditText et1 TextView t1 t2 Button b1 b2 String result Con
  • 无法将参数发送到 PHP POST 参数 android

    我目前正在使用 android volley 并尝试通过发送productID来选择产品详细信息以获取产品的详细数据 JSONObject params new JSONObject try params put ProductID int
  • 如何解密 Objective C/IOS 中用 php 加密的文件?

    我在谷歌上搜索了太多这个错误 但没有发现任何有用的东西 我使用以下代码获取在 php 中加密的文件 mcrypt encrypt MCRYPT RIJNDAEL 128 privateencryptkey base64 encode fil
  • Hint.interpret 在用于 Polysemy.Sem 值时会给出编译器错误

    我正在尝试编译Polysemy https hackage haskell org package polysemy 1 2 3 0 docs Polysemy html运行时使用 Hint 语言 Haskell 解释器 https hac