如何输入两个元素?关于Haskell温度转换代码的技术问询
没问题,我来帮你在这段Haskell温度转换代码里实现输入两个元素的功能。咱们一步步来,先理清楚需求:你应该是想让程序能接收两个温度输入(可以是华氏或摄氏),然后分别完成转换并输出结果对吧?
首先,我先给你补全并优化代码,同时实现双输入的功能:
支持双输入的温度转换完整代码
module Q5Degrees where -- 摄氏温度c与华氏温度f的关系:c = (f - 32) * 5 / 9,反向则是f = c * 9 /5 +32 -- 定义温度类型,添加Read实例方便解析输入 data Fahrenheit = F Double deriving (Show, Read) data Celsius = C Double deriving (Show, Read) -- 华氏转摄氏 fahrenheitToCelsius :: Fahrenheit -> Celsius fahrenheitToCelsius (F f) = C $ (f - 32) * 5 / 9 -- 摄氏转华氏 celsiusToFahrenheit :: Celsius -> Fahrenheit celsiusToFahrenheit (C c) = F $ c * 9 / 5 + 32 -- 通用转换:自动适配输入类型 convert :: Either Fahrenheit Celsius -> Either Celsius Fahrenheit convert (Left f) = Right $ fahrenheitToCelsius f convert (Right c) = Left $ celsiusToFahrenheit c -- 处理两个输入的逻辑 processTwoInputs :: Either Fahrenheit Celsius -> Either Fahrenheit Celsius -> (Either Celsius Fahrenheit, Either Celsius Fahrenheit) processTwoInputs input1 input2 = (convert input1, convert input2) -- 交互主函数:读取两个输入并输出结果 main :: IO () main = do putStrLn "请输入第一个温度(格式:F 数值 或 C 数值,比如 F 32 或 C 100):" input1Str <- getLine let input1 = read input1Str :: Either Fahrenheit Celsius putStrLn "请输入第二个温度:" input2Str <- getLine let input2 = read input2Str :: Either Fahrenheit Celsius let (res1, res2) = processTwoInputs input1 input2 putStrLn $ "第一个温度转换结果:" ++ show res1 putStrLn $ "第二个温度转换结果:" ++ show res2
关键部分说明:
- 给
Fahrenheit和Celsius加上Read实例,这样我们可以直接把用户输入的字符串解析成对应的温度类型,不用手动处理字符串拆分。 - 用
Either类型统一处理两种输入(要么是华氏,要么是摄氏),这样转换逻辑可以复用,不用写两套几乎一样的代码。 processTwoInputs函数专门负责处理两个输入,分别调用转换逻辑后返回结果。main函数负责和用户交互:提示输入、读取解析、输出结果,流程清晰。
示例运行效果:
请输入第一个温度(格式:F 数值 或 C 数值,比如 F 32 或 C 100):
F 98.6
请输入第二个温度:
C 25
第一个温度转换结果: Right (C 37.0)
第二个温度转换结果: Left (F 77.0)
如果你只需要处理同类型的两个输入(比如两个华氏转摄氏),可以简化代码,比如:
-- 简化版:仅处理两个华氏温度转摄氏 main :: IO () main = do putStrLn "请输入第一个华氏温度:" f1 <- read <$> getLine putStrLn "请输入第二个华氏温度:" f2 <- read <$> getLine let c1 = fahrenheitToCelsius (F f1) c2 = fahrenheitToCelsius (F f2) putStrLn $ "第一个华氏转摄氏:" ++ show c1 putStrLn $ "第二个华氏转摄氏:" ++ show c2
这样就完全满足你的需求啦,你可以根据实际场景选择对应的版本~
内容的提问来源于stack exchange,提问作者studyer
相关产品推荐
相关产品推荐

