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
相关产品推荐
相关产品推荐

