理解Haskell的Cast操作符

Geo*_*rge 10 haskell

假设我们已经导入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)最近的例子是改变的类型7IntegerDouble:

> 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)

fre*_*yle 7

是否有一个使用强制转换的例子,它真正地将值的类型从一种类型"改变"到另一种类型?

简单回答是不.但是,可能存在一种你不知道你的类型的情况,因为它被量词"存在""隐藏"了.这是一个例子:

{-# 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)


Mat*_*hid 5

Typeable该类的目的是允许您在不知道其确切类型时处理数据.cast运算符的目的是检查某些数据是否具有特定类型,如果是,则让您使用该类型.这就是为数据的类型签名做些什么.实际根本不会改变.

如果你想改变某些数据的,那不是转换,那就是转换.有各种各样的功能可以做到这一点.例如,fromIntegral将某个实例Integral变成其他东西.(例如,IntDouble.)这不是铸造的内容.