Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 将一种数据类型转换为另一种数据类型_Haskell - Fatal编程技术网

Haskell 将一种数据类型转换为另一种数据类型

Haskell 将一种数据类型转换为另一种数据类型,haskell,Haskell,我非常熟悉命令式语言及其特点。所以,我想知道如何将一种数据类型转换为另一种数据类型 ex: in c++ static_cast<> in c ( data_type) <another_data_type> ex: 在C++中 静态浇铸 在c中 (数据类型) 使用显式强制功能 例如,from Integral会将任何Integral类型(Int,Integer,Word*等)转换为任何数字类型 您可以使用按类型

我非常熟悉命令式语言及其特点。所以,我想知道如何将一种数据类型转换为另一种数据类型

ex:
   in c++
           static_cast<>
    in c
           ( data_type) <another_data_type>
ex:
在C++中
静态浇铸
在c中
(数据类型)

使用显式强制功能

例如,
from Integral
会将任何
Integral
类型(
Int
Integer
Word*
等)转换为任何数字类型


您可以使用按类型查找适合您需要的实际函数。

有许多不同的函数可以转换不同的数据类型。 例如:

fromIntegral-在say Int和Double之间转换

打包/解包-在ByteString和String之间进行转换


read-to-convert-from-String-to-Int

Haskell的类型系统与C/C++/Javas非常不同,而且比C/C++/Javas更智能。为了理解为什么你不能得到你期望的答案,比较两者会有所帮助

对于C和friends,类型是描述内存中数据布局的一种方式。编译器确实会进行一些健全性检查,以确保内存没有损坏,但最终它会保留所有字节,您可以随时调用它们。指针在内存中的布局总是相同的,但可以引用任何东西或(令人恐惧的)什么都不引用,这一点对于指针来说更是如此

在Haskell中,类型是一种用来向编译器写入数据的语言。作为一名程序员,你无法控制编译器如何表示数据,而且由于haskell很懒惰,你程序中的很多数据可能不再是一种按需生成值的承诺(在代码GHC和HUGS中称为
thunk
)。虽然可以指示c编译器以不同的方式处理数据,但没有等效的方法告诉haskell编译器将一种类型视为另一种类型

正如在其他答案中提到的,有些类型有明显的方法可以将一种类型转换为另一种类型。任何数字类型,如Double、Fraction或Real(通常是
Num
类的任何实例),都可以从
整数
生成,但我们需要使用专门设计的函数来实现这一点。从某种意义上说,这不是一个“强制转换”,而是一个实际的函数,就像
\x->x>0
是一个将数字转换成布尔值的函数一样

我最后再猜猜你为什么会问这样的问题。当我刚开始使用haskell时,我编写了很多函数,如:

area :: Double -> Double -> Double -- find the area of a rectangle
area x y = x * y

然后,我会发现自己到处转储
fromInteger
调用,以获得函数的正确类型的数据。来自C语言背景的我用单态类型编写了所有函数。不需要从一种类型强制转换到另一种类型的诀窍是编写使用不同类型的函数。Haskell类型类对于OOP程序员来说是一个巨大的转变,因此在最初的几次尝试中,它们常常被忽略,但正是它们使原本非常严格的Haskell类型系统可用。如果你可以放松你的类型签名(例如,<代码>区域:(Num A)= > A- > A- > A <代码> >,你会发现你自己更希望那个演员功能更少。

我只能猜测你为什么得到了投票:你没有给出任何用例,而且在Haskell中很少需要这个特性本身,而不是C和C++。你在哪里需要它?为什么?答案很大程度上取决于此。没有通用的类型转换方法,因为它不适合haskell类型系统(比c/c++系统更干净)。相反,您有几个转换函数(每个函数处理给定的typeclass)@Sarah我想您是对的。尽管如此,我还是想说这是一个值得问的问题,因为来自经典编程语言的人可能会在某个时候问自己如何转换。你可能想提供一些具体的例子。@Simon我同意,只是这看起来更像是“我希望新语言x做旧语言y能做的事情”,而不是“我希望新语言x做旧语言y能做的事情”“哎呀,我想知道我是如何用新的语言x做foo的,因为我似乎需要它来做bar。”