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 和从函数返回 的相关文章

随机推荐