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 值时会给出编译器错误 的相关文章

  • 在 win32/cygwin 上编译 haskell 模块网络

    我正在尝试编译 Network HTTP http hackage haskell org package network http hackage haskell org package network 在 win32 cygwin 上
  • 哈斯克尔状态单子

    是否putState Monad 的函数会更新实际状态还是仅返回具有新值的新状态 我的问题是 State Monad 可以在命令式设置中像 全局变量 一样使用吗 并且确实put修改 全局变量 我的理解是 不 它不会修改初始状态 但是使用单子
  • 仪器化状态单子

    我正在努力给予Monad and MonadState的实例State 计算的数量 gt gt return get and put运营 data Counts Counts binds Int returns Int gets Int p
  • 当单态限制打开*时,如何解决歧义问题?

    因此 在学习 Haskell 时 我很快就遇到了可怕的单态限制 在 ghci 中 Prelude gt let f print show Prelude gt f 5
  • Control.Arrow 与 Data.Tuple.Extra

    我经常使用以下功能Data Tuple Extra图书馆 first second and both 有等效的 函数Control Arrow 其实我更喜欢Data Tuple Extra因为我完全迷失了文档Control Arrow 使用
  • 我们不应该使用单子绑定来使用循环写下 mfix 的情况

    我一直在尝试写mfix向下使用Control Arrow loop https hackage haskell org package base 4 14 0 0 docs src Control Arrow html loop 我想出了不
  • Haskell 单例:我们可以通过 SNat 获得什么

    我正在尝试使用 Haskell 单例 在论文中使用单例进行依赖类型编程 http cs brynmawr edu rae papers 2012 singletons paper pdf并在他的博客文章中单例 v0 9 发布 https t
  • Haskell 真的是纯粹的吗(有任何语言可以处理系统外的输入和输出)吗?

    在谈到函数式编程中的 Monad 后 该功能是否真的使语言变得纯粹 或者它只是黑板数学之外的现实世界中计算机系统推理的另一张 免狱卡 EDIT 这不是有人在这篇文章中所说的火焰诱饵 而是一个真正的问题 我希望有人能用它来击倒我并说 证明 它
  • 如何将可选标志解析为 Maybe 值?

    我正在尝试使用optparse 应用程序 https hackage haskell org package optparse applicative 0 11 0 2解析一个Maybe String但我找不到任何地方如何处理Maybe 我
  • Haskell 中的常量变量声明

    要声明常量变量 我可以在 Ruby 中执行以下操作 class COLOR RED 10 BLUE 20 GREEM 30 end COLOR RED回报10 COLOR BLUE回报20 等等 我如何在 Haskell 中实现这一点 我想
  • 'lens' 的阴谋集团依赖性解析失败

    我刚刚做了一个阴谋更新并尝试从 hackage 安装 lens 这给了我以下错误 cabal install j lens Resolving dependencies Configuring dlist 0 7 0 1
  • 谁能解释一下 GHC 对 IO 的定义吗?

    标题非常自我描述 但有一个部分引起了我的注意 newtype IO a IO State RealWorld gt State RealWorld a 剥离newtype 我们得到 State RealWorld gt State Real
  • 列表理解:制作列表列表

    你好 我正在尝试在 haskell 中创建一个函数 该函数接受一个数字 a 使用列表 即数字 将其一部分4它会创造 1 1 1 1 1 1 2 1 3 2 2 4 我正在考虑使用列表理解来创建列表 x 然后使用 1 n 中的数字创建更多列表
  • GHC 是否使用存在类型的动态调度?

    下面的代码是否使用了 C 或 Java 中所理解的动态调度 据我了解 在最后一行 编译器不可能在编译时知道要调用哪个 实现 但代码会编译并产生正确的结果 有人可以解释一下 这背后有什么样的实现 例如 vptr 吗 LANGUAGE Exis
  • 我应该使用镜头中的什么来按索引构建只读吸气剂?

    我有一个内部细节被隐藏的类型 我想提供某种镜头 可以在特定索引处读取所述类型的元素 但是not修改它们 一个Ixed我的类型的实例似乎没有做我想要的事情 因为它明确允许修改 尽管不允许插入或删除 如果我想允许只读索引 我不确定我使用什么 如
  • 处理许多不相关的类型时避免样板

    我正在编写处理以下值的代码语言 扩展 注释 语法 http hackage haskell org packages archive haskell src exts 1 1 4 doc html Language Haskell Exts
  • Haskell 测量函数性能

    在 Haskell 中 我如何 简单地 测量函数的性能 例如 运行需要多长时间 或者需要多少内存 我知道分析 但是 是否有一种更简单的方法不需要我对代码进行太多更改 测量运行需要多长时间以及需要多少内存是两个独立的问题 即 基准测试和分析
  • 对元组列表进行排序的函数 - Haskell

    抱歉 这个简单的问题只是我对 haskell 非常陌生 我正在尝试编写一个函数 order 它将对另一个函数 Frequency 生成的元组列表进行排序 频率计算列表中不同元素的数量 a给出一个这样的结果 比如 gt 频率 aabbbccc
  • 地图不是接受一个函数而列表返回一个列表吗?

    map2 List a gt b gt c gt a gt b gt c map2 List f map2 List f a as bs map f a bs map2 List f as bs 这是我的讲座中的一个示例 它尝试将二元函数应
  • 简单的秒差距示例会产生类型错误

    我正在尝试编译这个简单的秒差距代码 import Text Parsec simple letter 但我不断收到此错误 No instance for Stream s0 m0 Char arising from a use of let

随机推荐

  • 使用 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