假设我们已经导入Data.Typeable了包含的内容cast :: (Typeable a, Typeable b) -> a -> Maybe b.
考虑一下
> cast 'n' :: Maybe Char
Just 'n'
Run Code Online (Sandbox Code Playgroud)
然而
> cast 7 :: Maybe Char
Nothing
Run Code Online (Sandbox Code Playgroud)
我理解上面的内容,但它似乎是一个微不足道的例子.它没有揭示为什么有人需要使用cast运算符(据我所见).
问题:是否有一个使用的cast例子真正"改变"一种类型的值到另一种类型?我能想到的(不实际工作GHCI)最近的例子是改变的类型7从Integer到Double:
> cast 7 :: Maybe Double
Just '7' -- this doesn't work, as 7 is typed as a Integer above; instead GHCi returns Nothing
Run Code Online (Sandbox Code Playgroud)
是否有一个使用强制转换的例子,它真正地将值的类型从一种类型"改变"到另一种类型?
简单回答是不.但是,可能存在一种你不知道你的类型的情况,因为它被量词"存在""隐藏"了.这是一个例子:
{-# LANGUAGE ExistentialQuantification #-}
import Data.Typeable
import Data.Maybe
data Foo = forall a . Typeable a => Foo a
main = print . catMaybes . map (\(Foo x) -> cast x :: Maybe Bool) $ xs
where
xs = [Foo True, Foo 'a', Foo "str", Foo False]
Run Code Online (Sandbox Code Playgroud)
输出将是:
[True,False]
Run Code Online (Sandbox Code Playgroud)
Typeable该类的目的是允许您在不知道其确切类型时处理数据.cast运算符的目的是检查某些数据是否具有特定类型,如果是,则让您使用该类型.这就是为数据的类型签名做些什么.实际值根本不会改变.
如果你想改变某些数据的值,那不是转换,那就是转换.有各种各样的功能可以做到这一点.例如,fromIntegral将某个实例Integral变成其他东西.(例如,Int对Double.)这不是铸造的内容.