我是一个初学的 Haskell 程序员。我想用一个简单的命令行程序来表示披萨公式,根据输入的人数返回适当的披萨数量。我知道我需要将我的输入 (IO String
) 转换为 Int 类型,然后使用 show
将结果转换为字符串。我该如何实现 IO String -> 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 foo -> bar
时,你应该紧张地眯起眼睛。一旦进入 IO,你无法 (咳咳) 退出,而这是件好事。 - Daniel Wagner输入 -> [纯函数魔法] -> 输出
,在这里安全地粘合纯代码和不纯的数据是整个重点。或者说,我可以用更符合习惯的方式来表达这个问题吗? - DanielIO a
转换为a
,除非在一个实际返回类型IO a
的函数中;相反,你要做的是编写一个函数f x = y
,然后在main
中,你可以像这样做:x <- readX; putStrLn (f x)
。在这里,x
从IO
中“提取”出来并传递给你的纯程序 (f
),所以你的其余代码可以是纯的。但是你只能在可以进行 IO 的函数内部做这种事情;通常情况下,你不能将IO a
转换为a
。 - amalloyIO
类型的集合可以做到这一点- GHC有一个特殊符号main
,它启动了这些操作。但是你无法从IO
中“退出”。IO foo -> IO bar
没问题;IO foo -> bar
,其中bar
中没有IO
,则没有太多有趣的实现。 - Daniel Wagner