2017-12-12 16 views
3

haskellの変数のタイプをチェックする方法はわかりませんが、私はgetLineでコンソールから何かを読むと、私はそれがintergerであると予想しますが、ユーザーは文字列を入力することができますまた、私は私のプログラムがクラッシュするのを望んでいません。たとえば、誰かが文字列を入力し、それをIntに変換しようとすると、クラッシュ(例外)されるので、変換可能かどうかをチェックしたいと思います。それ、どうやったら出来るの ?任意の助けてくれてありがとう:)haskellのタイプをチェックする方法

main1 = do 
     let g <- getLine 
      k = g :: Int 
      if(k :: Int) 
       then ........ 
+0

厥ていない文字列がintに変換する方法。あなたがhaskellを学ぶ際にIOの章で 'read'を読んでください – vikingsteve

+0

Haskellは実行時にタイプタグを保持する必要がないように設計されています。コンパイル時にタイプを消去してメモリフットプリントを減らすことができます。本当に必要な場合は、型タグを保持する 'Typeable'があります。あなたの問題では、実行時の型情報はまったく必要なく、文字列を静的に既知の型に解析する必要があります。 – chi

答えて

7

EDIT:あなたに注意してください常にgetLineから文字列を持っている - それはそれは返すタイプです。その文字列に数字のascii表現が含まれていて、それを読み続けている場合。

文字列がg、そしてg :: Intの場合、コンパイラは単に「いいえ、あなたは間違っています」という文字列です。翻訳を実行する必要があります - 文字列を解析し、Intを計算します。最も簡単に利用できる方法は、プレリュードのreadreadMaybeText.Readです。

読むには動作しますが、無効な入力に例外をスローします:

Prelude> read "4742" :: Int 
4742 
Prelude> read "no" :: Int 
*** Exception: Prelude.read: no parse 
Prelude> read "191andmore" 
*** Exception: Prelude.read: no parse 

多分バリアントは、安全な例外です:

Prelude> import Text.Read 
Prelude Text.Read> readMaybe "181" :: Maybe Int 
Just 181 
Prelude Text.Read> readMaybe "no" :: Maybe Int 
Nothing 
Prelude Text.Read> readMaybe "211andmore" :: Maybe Int 
Nothing 
+0

'::'で入力する前に '::'が動作するかどうかを確認する方法はありますか?あなたが ''いいえ ':: Int'でタイプしたように例外が出てきて、どうにか動作するかもしれませんが、余分なデータコンストラクタがなければ可能ですか? –

+1

'::'は常にコンパイル時に評価されます。これは型アノテーションなので、 'a :: SomeType'はJavaやC++で' SomeType a = ...; 'と同じです。コンパイル時に動作するかどうかは分かりません。 –

+0

@SilvioMayolo多くのご質問をおかけして申し訳ありませんが、Thomas M. DuBuisson氏によると、入力が無効で、私は例外を避けるためにどのような安全手段ですか? –

関連する問題