对于任何特定类型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类型系统限制的纯粹学术兴趣,没有任何特定的任务需要解决.
您正在寻找cast在Data.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,...)可能.
| 归档时间: |
|
| 查看次数: |
219 次 |
| 最近记录: |