欢迎访问宙启技术站
智能推送

使用Haskell构建一个天气预报应用程序

发布时间:2023-12-09 15:20:25

下面是一个基于Haskell的天气预报应用程序的简单实现。该应用程序可以根据用户输入的城市名称,使用开放的天气API获取实时天气信息,并将其显示给用户。

首先,我们需要引入一些必要的模块:

{-# LANGUAGE DeriveGeneric #-}

import Data.Aeson
import Data.ByteString.Lazy.Char8 (pack)
import GHC.Generics
import Network.HTTP.Simple

现在,我们定义我们的数据类型,以便可以从JSON响应中解析天气信息:

data Weather = Weather {
  id :: Int,
  main :: String,
  description :: String
} deriving (Show, Generic)

instance FromJSON Weather

接下来,我们定义一个辅助函数,该函数使用HTTP Simple库向天气API发送HTTP请求,并将响应转换为JSON:

fetchWeather :: String -> IO Weather
fetchWeather city = do
  let url = "http://api.openweathermap.org/data/2.5/weather?q=" ++ city ++ "&appid=your_api_key"
  request <- parseRequest url
  response <- httpJSON request :: IO (Response Value)
  let weather = getResponseBody response
  return $ decode $ pack $ show weather

注意,你需要将"your_api_key"替换为你自己的天气API密钥。

最后,我们定义一个主函数,该函数会提示用户输入城市名称,并显示对应城市的天气信息:

main :: IO ()
main = do
  putStrLn "请输入城市名称:"
  city <- getLine
  weather <- fetchWeather city
  case weather of
    Just w -> putStrLn $ "城市:" ++ city ++ " 天气:" ++ main w
    Nothing -> putStrLn $ "无法获取天气信息"

让我们来看看我们的应用程序是如何工作的。在命令行提示中,用户将被要求输入一个城市的名称。然后我们将使用该城市名称调用fetchWeather函数,并将结果绑定到weather变量中。如果成功获取到天气信息,我们将显示城市名称和主要天气描述。否则,将显示一个错误消息。

这只是一个基本的例子,你可以根据你的需要扩展它并添加更多功能。通过使用Haskell的强大类型系统和函数式编程特性,你可以构建出一个非常健壮和可维护的天气预报应用程序。