4

Haskell はそのような表現力豊かな型システムを持っているので、あるデータが何らかの型であるかどうかを問い合わせることができる直接サポートされているものはありますか? ラケットのように、(String? "Hi")(戻りtrueます)などMyType? somedata -> Bool

4

5 に答える 5

19
isInt :: Int -> Bool
isInt _ = True

isString :: String -> Bool
isString _ = True

...
于 2011-06-16T17:36:00.580 に答える
12

一般に、強力な型付けとは、最初からそのような状況に陥らないことを意味します。与えられた型を常に知っているか、それについて何も知らないが、サポートされている関数 (型クラス インスタンス) の辞書を持っています。ただし、 GHC ではData.Typeable、型システムで汚いトリックを行ってジェネリック型を取得する必要があります。

于 2011-06-16T17:32:14.217 に答える
7

基本的に、あなたの質問は Haskell では意味がありません。

Haskell は、コンパイル時にすべての型を静的に認識します。したがって、「型のテスト」という概念はありません。これは動的テストになります。実際、GHC はすべての型情報を消去します。これは、実行時に必要になることは決してないためです。


これに対する唯一の例外は、データが文字列などのシリアル化された形式で表される場合です。次に、値の型が正しいかどうかをテストする方法として解析を使用します。または、上級ユーザーの場合、特定の高次の汎用操作を解決するために、実行時に一部の型情報が必要になる場合があります。

于 2011-06-16T17:51:43.347 に答える
1

タイプを動的にチェックする必要がある場合は、何か間違ったことをしています。これは通常、型再構築機能を備えたほとんどの言語に当てはまるため、関数型言語はHaskell、OCaml、またはF#のようになります。

強い型再構成子とパターンマッチングがありますが、なぜ型を要求する必要があるのですか?

于 2011-06-16T17:33:28.797 に答える
0

他の回答に加えて...

必要に応じて、このモジュールを使用しData.Dynamicて Haskell で動的型を操作できます。例えば:

> let dyns = [ toDyn (5 :: Int), toDyn "hello", toDyn not ]

次に、次を使用して特定のタイプのテストを簡単に作成できますfromDynamic

isString :: Dynamic -> Bool
isString dyn = isJust (fromDynamic dyn :: Maybe String)

そして、それを任意のDynamic値に適用して、以下が含まれているかどうかを判断できStringます。

> map isString dyns
[False,True,False]

したがって、モジュールを使用して動的型付けを使用することを選択した場合Data.Dynamic、はい、これを行うことができます。

于 2011-06-16T23:39:35.580 に答える