Haskell:I/O 和从函数返回

2023-12-28

请耐心等待,因为我对函数式编程和 Haskell 非常陌生。我试图在 Haskell 中编写一个函数,它接受一个整数列表,打印所述列表的头部,然后返回列表的尾部。该函数的类型必须是 [Integer] -> [Integer]。为了提供一些上下文,我正在编写一个解释器,并且当在关联列表中查找其各自的命令时调用该函数(键是命令,值是函数)。

这是我写的代码:

dot (x:xs) = do print x
      return xs

编译器给出以下错误消息:

forth.hs:12:1:
Couldn't match expected type `[a]' against inferred type `IO [a]'
  Expected type: ([Char], [a] -> [a])
  Inferred type: ([Char], [a] -> IO [a])
In the expression: (".", dot)

我怀疑点函数中对 print 的调用是导致推断类型为 IO [a] 的原因。有什么方法可以忽略 print 的返回类型,因为我需要返回的只是传递给 dot 的列表的尾部。

提前致谢。


在大多数函数式语言中,这都是可行的。然而,Haskell 是一个pure功能性语言。不允许在函数中进行 IO,因此该函数可以是

  1. [Int] -> [Int]不执行任何IO或
  2. [Int] -> IO [Int] with IO

的类型dot编译器推断是dot :: (Show t) => [t] -> IO [t]但你可以声明它是[Int] -> IO [Int]:

dot :: [Int] -> IO [Int]

参见 IO 单子:http://book.realworldhaskell.org/read/io.html http://book.realworldhaskell.org/read/io.html


我没有提到过System.IO.Unsafe.unsafePerformIO应该非常小心地使用它,并充分了解其后果。

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

Haskell:I/O 和从函数返回 的相关文章

  • 使用 Haskell 的欧拉项目 #1

    import Data Set euler Int euler sum x x lt nums where nums Data Set toList Data Set union Data Set fromList 3 6 999 Data
  • 如何在 Kotlin 中正确处理大于 127 的 Byte 值?

    假设我有一个带有变量的 Kotlin 程序b类型的Byte 外部系统向其中写入大于的值127 外部 意味着我无法更改它返回的值的类型 val a Int 128 val b Byte a toByte Both a toByte and b
  • Haskell 真的是纯粹的吗(有任何语言可以处理系统外的输入和输出)吗?

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

    我有一个构建器类 它从大多数方法返回自身以允许菊花链 为了使此功能适用于子类 我希望父方法返回子类的实例 以便子方法可以链接到末尾 public class BaseBuilder
  • 如何在shell脚本中读取单个字符

    我想要类似的选项getche 如何从命令行读取单个字符输入 Using read命令我们可以做到吗 在巴什中 read可以做到 read n1 ans
  • 如何指定 sbcl(或 common lisp)向量中的元素类型?

    我尝试在 sbcl 1 1 14 中执行以下代码 但类型检查似乎忽略了向量元素的声明 defun test vec declare type vector integer vec format nil a elt vec 0 有什么提示吗
  • 'lens' 的阴谋集团依赖性解析失败

    我刚刚做了一个阴谋更新并尝试从 hackage 安装 lens 这给了我以下错误 cabal install j lens Resolving dependencies Configuring dlist 0 7 0 1
  • 列表理解:制作列表列表

    你好 我正在尝试在 haskell 中创建一个函数 该函数接受一个数字 a 使用列表 即数字 将其一部分4它会创造 1 1 1 1 1 1 2 1 3 2 2 4 我正在考虑使用列表理解来创建列表 x 然后使用 1 n 中的数字创建更多列表
  • System.IO.IOException:进程无法访问文件“.txt”,因为它正在被另一个进程使用

    我正在使用下一个代码来记录 Web 应用程序的错误 using StreamWriter myStream new StreamWriter sLogFilePath true myStream WriteLine string Forma
  • 类型转换为具有相同属性的另一个

    在我的应用程序的一个部分中 我使用从 xsd 方案生成的类型 我有 2 个版本的架构 2008 和 2009 我使用的类型是 DatumType 在每个方案中 该类型都包含相同的属性 它们是精确的 除了命名空间 有什么方法可以将 Datum
  • 在 haskell 中处理 IO 与纯代码

    我正在编写一个shell脚本 我在haskell中的第一个非示例 它应该列出一个目录 获取每个文件大小 进行一些字符串操作 纯代码 然后重命名一些文件 我不确定我做错了什么 所以有两个问题 我应该如何安排这样的程序中的代码 我有一个具体问题
  • 我什么时候应该使用 file.read() 或 file.readlines() ?

    我注意到 如果我迭代打开的文件 则迭代它的速度要快得多 而无需read首先 那是 l open file r for line in l 比 l open file r for line in l read or l open file r
  • 存在函数依赖关系时类型推断如何工作

    考虑下面的代码 LANGUAGE MultiParamTypeClasses FlexibleInstances FunctionalDependencies UndecidableInstances FlexibleContexts cl
  • Haskell 错误处理方法

    毫无疑问 Haskell 中有多种机制来处理错误并正确处理它们 错误单子 要么 也许 异常等 那么为什么用其他语言编写容易出现异常的代码比用 Haskell 感觉更简单呢 假设我想编写一个命令行工具来处理命令行上传递的文件 我想 验证提供的
  • 这个程序有什么问题?

    include
  • 在 Haskell 命令行应用程序中提示输入密码

    以下 Haskell 程序提示用户在终端中输入密码 如果输入正确则继续 main do putStrLn Password password lt getLine case hash password member database of
  • 如何使用用户输入变量作为通用包的参数?

    In Stack adb我指定了两个参数 大小和类型 我想创建一个堆栈 该堆栈的数据类型与用户在我的堆栈中指定的数据类型完全相同multistack adb file 我似乎找不到一种方法来创建新的包或使用用户定义的堆栈类型变量来实例化堆栈
  • 如何避免编写这种类型的 Haskell 样板代码

    我经常遇到这种情况 这很烦人 假设我有一个 sum 类型 它可以保存一个实例x或一堆其他无关的事情x data Foo x X x Y Int Z String other constructors not involving x 要声明
  • 类型级编程有哪些示例? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我不明白 类型级编程 是什么意思 也无法使用Google找到合适的解释 有人可以提供一个演示类型级编程的示例吗 范式的解释和 或定义将
  • 为什么 Haskell 中的点是从右向左排列的?

    如果我们有两个函数 f and g 然后在哈斯克尔h f g相当于h x f g x IE 这些函数从右到左应用于输入 有什么根本原因可以解释为什么它是从右到左 而不是从左到右吗 IE 他们为什么不做h f g相当于h x g f x 反而

随机推荐