【问题标题】:Haskell trouble with returning in functionsHaskell 函数返回问题
【发布时间】:2013-03-02 05:48:11
【问题描述】:
while :: Int -> Bool -> (Int,Int) -> (Int,Int) ->[Int] -> String
while arguments validity premRange atomRange operators = 
     return(if validity then "Hello" else "NO")



main :: IO()
main =
    do   
putStrLn "Welcome to Random Argument Generator"
arguments <- getArguments
validity <- getValidity
putStrLn "Enter the range of the number of premises to each argument"
premRange <- getRange
putStrLn "Enter the range of the number of atomic statments per premises"
atomRange <- getRange
operators <- getOperators
putStrLn "Thank You!\nExecuting..."
test <- while arguments validity premRange atomRange operators
putStrLn "Good Bye"

它抱怨我在一段时间内回来并打电话给它。我把这个函数作为一个测试,我真的很困惑它到底在抱怨什么。

【问题讨论】:

  • return 在 Haskell 中并不意味着它在其他语言中的含义。对于普通功能,您永远不需要使用return
  • 我使用的 IO 函数返回了这些函数,它们起作用了,但出于其他原因
  • @user2150839, return 在 Haskell 中专门针对 IO(和其他单子);即它使用纯值进行IO 计算。 return :: a -&gt; IO a
  • @user2150839:在正常语言中,从函数返回 monad 看起来像 return IO("xxx")。在 Haskell 中,return 语句是隐式的,monad 构造函数称为return"xxx" 保持不变。

标签: haskell if-statement return


【解决方案1】:

在 Haskell 中,if 等表达式是函数的完美定义。你可以删除return这个词。

在那之后,main 会出现问题,其中一行不做 I/O,因此它的类型与周围的 do 不兼容(我认为):

test <- while arguments validity premRange atomRange operators

但是,啊哈,您可以将其更改为:

let test = while arguments validity premRange atomRange operators

【讨论】:

  • 嗯,是的,我也在试图找出原因
  • 原来我需要把它变成一个我不完全理解为什么的 IO 字符串,然后保留 if 语句作为返回。我认为 IO 主要用于输出到文件或屏幕,而不是分配给 IO 函数中的某些内容
  • ooooooooo 没错
  • 如果您使用let test = while ...,则不需要将字符串设为 IO
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
相关资源
最近更新 更多