3

たとえば、次のデータ構造があるとします。

data Foo = Bool Bool | Int Int | Double Double

さて、これを行う簡単な方法はありますか:

foo :: Typeable a => a -> Foo
foo x = maybe (error "i dunno") id $
  liftM Bool   (cast x) `mplus`
  liftM Int    (cast x) `mplus`
  liftM Double (cast x)

Typeable型でパターン マッチングの構文を作成することを考えた人はいますか?

4

3 に答える 3

6

使用typeOfとガード:

foo x
    | tx == typeOf "str" = "string"
    | tx == typeOf True  = "bool"
    | otherwise          = "i dunno"
  where tx = typeOf x
于 2011-05-04T15:39:01.457 に答える
4

ここでビュー パターンを使用できます。これらは非常に便利な拡張機能です。

{-# LANGUAGE ViewPatterns #-}

import Data.Data

data Foo = Bool Bool | Int Int | Double Double
         deriving (Show)

foo :: Typeable a => a -> Foo
foo (cast -> Just x) = Int x
foo (cast -> Just x) = Bool x
foo (cast -> Just x) = Double x
foo _ = error "i dunno"

結果:

*メイン> :l foo_typeable.hs
[1/1] Main のコンパイル ( foo_typeable.hs、解釈済み )
OK、モジュールがロードされました: メイン。
*メイン> foo "123"
*** 例外: わからない
*メイン> foo 1
*** 例外: わからない
*Main> foo (1 :: Int)
整数 1
*Main> foo (1 :: 整数)
*** 例外: わからない
*Main> foo (1 :: ダブル)
ダブル 1.0
于 2011-05-04T21:57:05.307 に答える
3

このバージョンは、、、、またはに限定されませんがBool、aはとして出力されます。IntDoubleString[Char]

foo :: Typeable a => a -> String
foo = show . typeOf
于 2011-05-04T15:43:41.987 に答える