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

Haskell Prelude中read函数用法与可转换类型技术咨询

Haskell Prelude中read函数详解:用法与可转换类型

当然熟悉啦!Haskell Prelude模块里的read函数是处理字符串转数据类型的核心工具,先来看它的类型签名:

read :: Read a => String -> a

这个签名的意思很直白:只要类型a属于Read类型类,read就能把输入的String转换成a类型的值。下面我用具体示例拆解它的用法,再说说哪些类型能被转换。

一、read函数的实用示例

因为read的返回类型是多态的,很多时候需要显式指定目标类型(用::标注),不然编译器没法确定你要转成什么。

1. 基础数值类型转换

-- 转Int类型
read "42" :: Int  -- 结果:42 :: Int
-- 转任意精度的Integer
read "-1234567890123" :: Integer  -- 结果:-1234567890123 :: Integer
-- 转浮点数Double
read "3.1415926" :: Double  -- 结果:3.1415926 :: Double
-- 转科学计数法的Float
read "1.2e-5" :: Float  -- 结果:1.2e-5 :: Float

2. 布尔值与字符转换

-- 转布尔值(注意大小写必须和Haskell内置的一致)
read "True" :: Bool  -- 结果:True :: Bool
read "False" :: Bool  -- 结果:False :: Bool
-- 转字符(字符串必须带单引号,和Haskell字符写法一致)
read "'z'" :: Char  -- 结果:'z' :: Char

3. 复合类型转换

只要复合类型的内部元素属于Read类,就能用read转换:

-- 转整数列表
read "[1,3,5,7]" :: [Int]  -- 结果:[1,3,5,7] :: [Int]
-- 转字符串列表(注意内部字符串的双引号要转义)
read "[\"apple\",\"banana\"]" :: [String]  -- 结果:["apple","banana"] :: [String]
-- 转(Int, String)元组
read "(100, \"hello haskell\")" :: (Int, String)  -- 结果:(100, "hello haskell") :: (Int, String)

4. 自定义类型转换

如果你的自定义类型派生了Read类,也能直接用read:

data Shape = Circle Double | Rectangle Double Double deriving (Read, Show)
read "Circle 5.0" :: Shape  -- 结果:Circle 5.0 :: Shape
read "Rectangle 3 4" :: Shape  -- 结果:Rectangle 3.0 4.0 :: Shape

二、String可转换的类型范围

所有属于Read类型类的类型都能被read处理,常见的包括:

  • 数值类:Int、Integer、Float、Double、Word(无符号整数系列)等
  • 基础类型:Bool、Char、String(注意转String时输入要带双引号,比如read "\"test\"" :: String)
  • 复合容器类型:列表[]、各类元组(,)/(,,)等(只要容器内的元素类型支持Read)
  • 自定义类型:只要在定义时通过deriving (Read)派生了Read类,就能用read转换

小提示

如果输入字符串的格式和目标类型不匹配,read会直接抛出运行时错误(比如read "abc" :: Int)。如果需要安全转换,可以用Text.Read模块里的readMaybe,它会返回Maybe a:成功时是Just 值,失败时是Nothing,避免程序崩溃。

内容的提问来源于stack exchange,提问作者sergeantSalty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:12:23