【问题标题】:Function Type in HaskellHaskell 中的函数类型
【发布时间】:2013-01-25 09:55:13
【问题描述】:

我是 Haskell 的新手。我想要一个函数,在其中我从用户那里获取一个 Int 值

putStr "Please Enter Your Number : "
submit_ans<- getLine

然后在一系列计算之后返回另一个 Int,它将被另一个调用它的函数使用。所描述功能的类型是什么?最后应该使用返回函数吗?

提前致谢!

更新 #1

好的,我更新了如下功能:

myFunction ::  Int -> IO Int 
myFunction action = do

      putStr "\tPlease Enter Your Number : "            
      submit_ans <- getLine 

      if action == 1
        then do 
       myFunctionII read submit_ans  
        else do
       putStrLn("\n")

它给了我这个错误:

*** Term           : myFunction 
*** Type           : Int -> IO Int
*** Does not match : IO a

【问题讨论】:

  • 你提到的这个“其他功能”,它的类型是什么?从您的 cmets 往下看,这听起来像是一个纯函数(即非 IO)。您不能从纯函数执行 IO 操作。
  • @gspr 这就是问题所在!我不知道我不能在纯功能中进行 IO 操作!话说回来,如果不能使用返回值,IO Int 的意义何在?
  • 当然可以用。但只能来自IO monad。部分“要点”确实是区分纯(非 IO)和不纯(IO)代码!当给定相同的输入时,纯函数总是返回相同的。在以 s 开头的日子里,每三个满月,一个不纯洁的人可能会烧毁你的房子并吃掉你的猫。能够区别对待这两种函数真是太好了。
  • 所以我的意思是:编写一个使用getLine 获取数字的IO 函数,然后从该函数调用你想要的纯函数用你得到的号码做事(你可以得到,因为你现在在 IO monad 中)。换句话说:让 IO 代码调用纯代码,而不是相反。
  • 我想我明白了。我现在将尝试实施它。谢谢!

标签: haskell io


【解决方案1】:

只需编写你的函数,比如g,作为一个纯计算,类型为Int -&gt; Int。然后你在 IO monad 中使用它作为

...
putStr "Please Enter Your Number : "
submit_ans <- getLine
let i = g (read submit_ans)
...
print i

edit:任何 Haskell 值都是纯的。函数是纯的。 IO x 是一个纯 Haskell 值。但它描述了一个不纯的计算,它由系统运行(例如,当你编译的应用程序运行时)。作为 its 执行的一部分,它将执行您的纯函数。

【讨论】:

    【解决方案2】:

    putStrLn 的类型为String -&gt; IO (),而myFunctionII 的类型似乎为Int -&gt; IO (),因此myFunction 的类型应为Int -&gt; IO (),因为if 的两个分支都返回IO ()

    myFunction :: Int -> IO ()
    myFunction action = do
      putStr "\tPlease Enter Your Number : "
      submit_ans <- getLine
    
      if action == 1
         then myFunctionII (read submit_ans)
         else putStrLn "\n"
    

    【讨论】:

      【解决方案3】:

      由于您正在执行 IO 操作并且返回的是 Int,所以我最好的猜测是 IO Int,但我无法确定,因为您的问题太模糊而无法清楚地回答。

      【讨论】:

      • 实际上我确实尝试过myFunction :: IO Int,但就像我提到的,另一个函数调用这个函数并使用返回的Int 值作为参数。它给了我错误,告诉我 IO Int 不是 Int。
      • 阅读 IO monad。您不能在纯函数(非 IO 类型)中调用 IO 函数,因为这会破坏引用透明度。如果你的 callee 也是一个 IO 函数,那么你可以像 getLine 那样做。
      • 我明白你的意思,但使用IO Int 并尝试从函数内部调用纯函数并使用 IO 操作也不起作用。 (我更新了帖子)
      猜你喜欢
      • 1970-01-01
      • 2021-12-31
      • 2017-12-04
      • 2011-08-28
      • 2019-10-08
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多