3 haskell
我对命令式语言及其功能非常熟悉.那么,我想知道如何将一种数据类型转换为另一种数据类型?
ex:
in c++
static_cast<>
in c
( data_type) <another_data_type>
Run Code Online (Sandbox Code Playgroud)
Haskell的类型系统与C/C++/Javas非常不同,而且相当聪明.要理解为什么你不会得到你期望的答案,这将有助于比较两者.
对于C和朋友来说,类型是一种描述内存中数据布局的方式.编译器确实进行了一些健全性检查,试图确保内存没有损坏,但最后它的所有字节都可以调用它们,无论你想要什么.对于总是在内存中布局相同但可以引用任何内容或(可怕地)没有引用的指针更是如此.
在Haskell中,类型是一种用编写器编写的语言.作为程序员,你无法控制编译器如何表示数据,并且因为haskell是懒惰的,程序中的大量数据可能不再是按需生成值的承诺(thunk在代码GHC和HUGS中称为a ).虽然可以指示ac编译器以不同方式处理数据,但是没有相同的方法来告诉haskell编译器通常将一种类型视为另一种类型.
正如其他答案中所提到的,有些类型有明显的方法可以将一种类型转换为另一种类型.任何数值类型,如Double,Fraction或Real(通常是Num类的任何实例)都可以由a制作Integer,但我们需要使用专门设计的函数来实现这一点.从某种意义上说,这不是一个"演员",而是一个实际的功能,就像\x -> x > 0将数字转换为布尔值的功能一样.
我最后会猜到为什么你可能会问这样的问题.当我刚开始使用haskell时,我写了很多函数,比如:
area :: Double -> Double -> Double -- find the area of a rectangle
area x y = x * y
Run Code Online (Sandbox Code Playgroud)
然后我会发现自己fromInteger在整个地方转储调用以获取函数的正确类型.来自C背景我用单态类型编写了所有函数.不需要从一种类型转换为另一种类型的技巧是编写适用于不同类型的函数.Haskell类型类对于OOP程序员来说是一个巨大的转变,因此它们经常在前几次尝试时被忽略,但它们是使得非常严格的haskell类型系统可用的原因.如果你可以放松你的类型签名(例如area :: (Num a)=> a -> a -> a),你会发现自己希望这种演员的功能更少.