haskell中的fromString - 检查返回的类型

时间:2016-05-10 18:15:59

标签: haskell

haskell中是否存在函数fromString?我希望除了从String转换为a之外,我还可以检查a是Integer还是Boolean。你能帮帮我吗?

3 个答案:

答案 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"

但是,如果用户未输入TrueFalse,则read将引发错误。因此,如果您知道自己有有效的输入,或者如果输入无效,则只能使用read

如果您需要检查无效输入,我认为最简单的方法是简单地编写自己的函数 - 至少对于BoolInt等简单类型:

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

请注意,readreadInt的来电永远不会失败,因为我们已经确认输入有效。

答案 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

当然,如果你真的想使用 IntegerBool,你可以使用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。如果您想了解readMaybereads实例的工作原理,建议您使用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 }。尝试实现自己的功能(最好使用MaybeEither这样的monad。