基本Haskell IO(IO字符串->;Int)?

基本Haskell IO(IO字符串->;Int)?,haskell,Haskell,我是初学者哈斯凯勒。我试图用一个简单的命令行程序来表示,这个程序需要很多人,并返回适当数量的比萨饼。我知道我需要将输入(IO String)转换为Int,然后使用show将结果转换为字符串。我如何IO字符串->Int?还是我给这只猫剥皮全错了 import System.Environment import System.IO pizzas :: Integral a => a -> a pizzas x = div (x * 3) 8 main = do putStrL

我是初学者哈斯凯勒。我试图用一个简单的命令行程序来表示,这个程序需要很多人,并返回适当数量的比萨饼。我知道我需要将输入(
IO String
)转换为Int,然后使用
show
将结果转换为字符串。我如何
IO字符串->Int
?还是我给这只猫剥皮全错了

import System.Environment
import System.IO

pizzas :: Integral a => a -> a
pizzas x = div (x * 3) 8

main = do
    putStrLn "How many people are you going to feed?"
    arg <- getLine
    -- arg needs to IO String -> Int
    -- apply pizzas function
    -- Int -> String
    putStrLn "You will need to order " ++ string ++ " pizzas."
导入系统环境
导入系统.IO
比萨饼:积分a=>a->a
比萨饼x=div(x*3)8
main=do
putStrLn“你要养活多少人?”
arg Int
--应用pizzas函数
--Int->String
putStrLn“您需要订购”++string++“比萨饼。”

如果可能,使用read将类型从字符串转换为适当的类型

使用show将整数转换为它的字符串表示形式

arg <- getLine
let num = pizzas (read arg)
putStrLn $ "You will need to order " ++ (show num) ++ " pizzas."

arg@Daniel这个答案在技术上是正确的,但这里要理解的是,当你做
arg时,我得到:
parse error on input'='
两种解决方案:~/It compiles!谢谢你的解答和解释。看来你在这里收集了一些好的答案,给了你一些好的提示。因此,大致来说,只要你开始思考
iofoo->bar
,你就应该紧张地眯起眼睛。你一进去就不能(咳嗽,咳嗽)离开IO,这是一件好事。我不确定我是否理解。。。我认为Haskell的工作原理是:
Input->[purefully Functional Magic]->Output
,其中安全地粘合纯代码和不纯数据是关键。还是我可以用一种更惯用的方式来表达这个问题?@Daniel是的,差不多是这样。但是……除了在实际返回type
ioa
的函数中,您不能真正从
ioa
转到
a
;相反,你做事情的方式是写一个函数
fx=y
,然后在
main
中做一些类似
x@Daniel的事情,你可以用
Input->Output
这样的类型来编程你的计算;但是,您需要将该计算连接到一些小部件,这些小部件实际上与世界交互,并生成一个类型为
Input
的值,然后以显示类型为
Output
的值的方式与世界交互。
IO
类型的集合可以做到这一点——GHC有一个特殊的符号,
main
,它启动了事情。但你无法从IO中“脱身”<代码>IO foo->IO条
正常
IO foo->bar
其中
bar
没有
IO
,它没有很多有趣的实现。是的,看起来我有很多关于绑定封装数据的知识要学习。Haskell似乎开始让困难的事情(重构代码、单元测试等)变得容易,而简单的事情(IO、打印多行、格式化字符串、库管理等)变得棘手。
arg <- readLn :: IO Int
let num = pizzas arg
putStrLn $ "You will need to order " ++ (show num) ++ " pizzas."