Haskell:I/O 和从函数返回

标签 haskell types io monads

请耐心等待,因为我对函数式编程和 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 的返回类型,因为我需要返回的只是传递给点的列表的尾部。

提前致谢。

最佳答案

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

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

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

点::[Int] -> IO [Int]

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

<小时/>

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

关于Haskell:I/O 和从函数返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4056867/

相关文章:

haskell - 如何查询默认方法的类型?

haskell - OCaml 中的 haskell TypeError 的等效项

c# - 检查 2 种类型是否相同

c# - 使用字符串值创建新实例

c - C select() 函数是否已弃用?

scala - 将类型与数据构造函数关联起来的 ADT 编码存在哪些问题? (例如 Scala。)

haskell - 既是递归的,又依赖于其他行为的行为

Excel VBA 集合和自定义数据类型

java - 如何在 Java 中获得主文件夹(或 appdata 文件夹,对于 Windows)的写入权限?

C 程序条件无法识别可操作的输入