Haskell:按类型过滤

Ser*_*ich 1 haskell

对于任何特定类型A:

data A = A Int
Run Code Online (Sandbox Code Playgroud)

有可能写这个功能吗?

filterByType :: a -> Maybe a
Run Code Online (Sandbox Code Playgroud)

Just . id如果A给出了type的值,并且Nothing对于任何其他类型的值,它应该返回.

使用任何手段(GHC exts,TH,introspection等)

NB.由于我关于Haskell类型系统的最后一个问题被社区批评为"非常过分简化",我觉得有必要说明,这是对Haskell类型系统限制的纯粹学术兴趣,没有任何特定的任务需要解决.

jos*_*uan 5

您正在寻找castData.Typeable

cast :: forall a b. (Typeable a, Typeable b) => a -> Maybe b 
Run Code Online (Sandbox Code Playgroud)

相关问题在这里

{-# LANGUAGE DeriveDataTypeable #-}
import Data.Typeable

data A = A Int deriving (Show, Typeable)
data B = B String deriving (Show, Typeable)

showByType :: Typeable a =>a ->String
showByType x = case (cast x, cast x) of
                 (Just (A y), _) ->"Type A: " ++ show y
                 (_, Just (B z)) ->"Type B: " ++ show z
Run Code Online (Sandbox Code Playgroud)

然后

> putStrLn $ showByType $ A 4
Type A: 4
> putStrLn $ showByType $ B "Peter"
Type B: "Peter"
>
Run Code Online (Sandbox Code Playgroud)

如果没有Typeable派生,就不存在关于底层类型的信息,你可以无论如何都可以执行一些cast转换

import Unsafe.Coerce (unsafeCoerce)

filterByType :: a -> Maybe a
filterByType x = if SOMECHECK then Just (unsafeCoerce x) else Nothing
Run Code Online (Sandbox Code Playgroud)

但是,那些信息在哪里?

然后,你不能写你的函数(或者我不知道如何),但在某些情况下(二进制内存检查,模板haskell,...)可能.