You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何输入两个元素?关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:03:08