请耐心等待,因为我对函数式编程和 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,因此该函数可以是
[Int] -> [Int]
不执行任何 IO 或[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/