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