如何解决在Haskell中将String映射为其数据类型
我有以下类型:
data Color = Red
| Yellow
| Green
| ...
我想要一个将字符串表示形式映射到特定颜色的函数。
str2Color :: String -> Color
str2Color "Red": Red
str2Color "Yellow": Yellow
str2Color "Green": Green
我可以枚举所有字符串,但是问题是所有颜色的列表都很长。有没有更简单的方法?
ps:为了便于说明,我们假设所有输入字符串都具有相应的颜色。
解决方法
正如@WillemVanOnsem在评论中指出的那样,您可以让编译器为您的Read
类型派生一个Color
实例:
data Color = Red | Yellow | Blue
deriving (Read,Show)
然后使该功能可用:
read :: String -> Color
将String
转换为相应的Color
。
完整示例:
data Color = Red | Yellow | Blue
deriving (Read,Show)
main = do
print (read "Red" :: Color)
print (read "Blue" :: Color)
如果read
不是有效的String
,则 Color
会引发异常。要自己处理这种情况,可以对结果使用Text.Read.readMaybe :: (Read a) => String -> Maybe a
和模式匹配。
import Text.Read (readMaybe)
main = do
print (readMaybe "Red" :: Maybe Color) -- Just Red
print (readMaybe "Beans" :: Maybe Color) -- Nothing
s <- getLine
case readMaybe s of
Just color -> print (color :: Color)
Nothing -> putStrLn ("Invalid color: '" ++ s ++ "'")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。