2016-05-10 7 views
1

haskellに関数fromStringが存在しますか?私は、文字列をaに変換する以外に、aBooleanかどうかを確認することができます。私たちを手伝ってくれますか ?fromString haskell - 返された型のチェックwith

+2

'read'? ...私はあなたの質問を理解するいくつかの問題を抱えています - あなたはいくつかの例を追加するか、それを修正しようとしますか? – Carsten

+0

私の考えでは、この質問は普遍的な 'readDyn :: String - > Maybe Dynamic'を求めています。これは何かを読むことができ、' Dynamic'がこれかそのタイプかどうかテストすることができます。 – chi

答えて

2

fromStringは、タイプライブラリIsStringの関数として既に存在しています。主な用途は、コンパイルオプション(-XOverloadedStrings)で、Haskellが持っているすべての異なる文字列の実装に文字列リテラルを使用できるようにすることです。厳密な/怠惰なByteStringと厳密な/怠惰なテキストが、他のインスタンスがあります。 URL、ファイルパス、その他のために。

あなたは両方ともと言い換えます。チェックの両方の操作があります。コンバージョンについては、readを使用することをおすすめします。

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またはFalsereadは、エラーがスローされます。ここではブール値に文字列を変換する簡単なプログラムです。有効な入力があることがわかっている場合、または入力が無効であれば問題なく終了する場合は、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 

なおreadへの呼び出しでreadIntは、入力が有効であることを既に確認しているので決して失敗しないはずです。

+4

必要な特定のタイプごとにパーサーを再実装するのではなく、 'Text.Read.readMaybe'を使うことをお勧めします。 – bheklilr

+0

@bheklilr - これはいい考えです。 – ErikR

+1

なぜなら、いつも物事を再実装してはならない理由の良い例です:あなたの 'readInt'パーサーは、負の数を受け入れません。 –

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] 

あなたは与えられた文字列ではなくNothingで、解析できなかった場合readはエラーを返しますので、あなたの入力が有効であることを確認することができない限り、しかし、私はreadはお勧めしません。代わりに独自の関数を実装してみてください(MaybeEitherなどのモナドを使用することをお勧めします)。

2

readMaybeText.Readから使用してください。値が解析され得ることができなかった場合は(別名readがエラーを投げるかの)Nothingを返します。もちろん

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の結果を使用します:readMaybeはプレリュードで利用可能であるreadsを使用

isPositive :: String -> Either String Bool 
isPositive xs = case readMaybe xs :: Maybe Integer of 
        Just n -> Right (n > 0) 
        Nothing -> Left "Not an Integer" 

留意されたいです。 readReadのインスタンスがどのように動作するかを知りたい場合は、readMaybereadsに再実装することをお勧めします。

関連する問題