haskell中是否存在函数fromString
?我希望除了从String转换为a
之外,我还可以检查a
是Integer还是Boolean
。你能帮帮我吗?
答案 0 :(得分:2)
fromString
已作为类型IsString
中的函数存在。它的主要用途是(使用-XOverloadedStrings
编译选项)允许您对Haskell具有的所有不同字符串实现使用字符串文字,例如: strict / lazy ByteString和strict / lazy Text,但还有其他实例,例如对于网址,文件路径等。
您提及转换和检查操作。对于转换,我建议使用read
。这是一个将字符串转换为Bool的简单程序:
main = do putStr "Enter a boolean:"
inp <- getLine
let b = read inp
if b then putStrLn "You entered True"
else putStrLn "You entered False"
但是,如果用户未输入True
或False
,则read
将引发错误。因此,如果您知道自己有有效的输入,或者如果输入无效,则只能使用read
。
如果您需要检查无效输入,我认为最简单的方法是简单地编写自己的函数 - 至少对于Bool
和Int
等简单类型:
readBool :: String -> Maybe Bool
readBool str | str == "True" = Just True
| str == "true" = Just True
| str == "False" = Just False
| str == "false" = Just False
| otherwise = Nothing
import Data.Char
readInt :: String -> Maybe Int
readInt str | all isDigit str = Just (read str)
| otherwise = Nothing
请注意,read
中readInt
的来电永远不会失败,因为我们已经确认输入有效。
答案 1 :(得分:2)
使用Text.Read
中的readMaybe
。如果无法解析该值,则返回Nothing
(如果read
会抛出错误,则返回此值):
import Text.Read (readMaybe)
isInteger :: String -> Bool
isInteger xs = (readMaybe xs :: Maybe Integer) /= Nothing
isBool :: String -> Bool
isBool xs = (readMaybe xs :: Maybe Bool) /= Nothing
当然,如果你真的想使用 Integer
或Bool
,你可以使用readMaybe
的结果:
isPositive :: String -> Either String Bool
isPositive xs = case readMaybe xs :: Maybe Integer of
Just n -> Right (n > 0)
Nothing -> Left "Not an Integer"
请注意,readMaybe
使用{Preler中提供的reads
。如果您想了解readMaybe
和reads
实例的工作原理,建议您使用read
重新实施Read
。
答案 2 :(得分:0)
使用read
:
λ> :t read
read :: Read a => String -> a
λ> read "42" :: Int
42
λ> read "True" :: Bool
True
λ> read "\"a string\"" :: String
"a string"
λ> read "[1,2,3]" :: [Int]
[1,2,3]
但是,除非您可以检查输入是否有效,否则我不推荐使用read
,因为如果无法解析给定字符串read
会返回错误,而不是Nothing
}。尝试实现自己的功能(最好使用Maybe
或Either
这样的monad。