Haskell 如何实现递归函数?

Haskell 如何实现递归函数?,haskell,ghc,Haskell,Ghc,下面定义了代数数据类型IntList: data IntList = Empty | Cons Int IntList 函数intListProd计算IntList类型的产品: intListProd :: IntList -> Int intListProd Empty = 1 intListProd (Cons x l) = x * intListProd l 但我不确定如何创建IntList类型 我试过: *Main> let x = Cons 3 *Main&g

下面定义了代数数据类型IntList:

data IntList = Empty | Cons Int IntList
函数intListProd计算IntList类型的产品:

intListProd :: IntList -> Int
intListProd Empty      = 1
intListProd (Cons x l) = x * intListProd l
但我不确定如何创建IntList类型

我试过:

*Main> let x = Cons 3
*Main> :t x
x :: IntList -> IntList

但是如何创建类型IntList以便调用intListProd呢?

一个
Cons
单元格包含两个内容:一个元素和一个尾部。如果列表只应包含一个元素,则尾部为空(由空构造函数
empty
表示)。因此,要表示包含3作为其唯一元素的列表,请使用:

let x = Cons 3 Empty

然后
:tx
将成为
IntList

一个
Cons
单元格包含两个东西:一个元素和一个尾部。如果列表只应包含一个元素,则尾部为空(由空构造函数
empty
表示)。因此,要表示包含3作为其唯一元素的列表,请使用:

let x = Cons 3 Empty

然后
:t x
将成为
IntList

您正在创建一个新的数据类型:

data IntList=Empty | Cons Int IntList

这基本上创建了2个数据构造函数函数:

> :t Empty
Empty :: IntList

> :t Cons
Cons :: Int -> IntList -> IntList
因此,第一个返回一个IntList类型,第二个需要2个参数(Int和IntList)并返回一个IntList

在绑定中,您只需部分应用
Cons
函数,只给它一个参数:

*Main> let x = Cons 3
这是要求你提供另一个完整类型的IntList。 现在,您可以通过两种方式获得IntList(因为此类型有两个构造函数):

对于第二个,b可以是空的,也可以是常数a'b':

Cons 3 (Cons 1 (Empty))

现在让我们更仔细地看一下第二种类型:

Cons Int ( Cons Int ( Cons Int ( IntList)))
记住Cons接受一个Int和一个IntList并返回一个IntList吗

Cons Int ( Cons Int ( IntList)) --Now doing the same we came up to
Cons Int (IntList) -- Once more
IntList 

这意味着我们的构造
Cons 3(Cons 2(Cons 1(空))
的类型为
IntList
,可用于对其应用
intListProd
计算。

您正在创建一个新的数据类型:

data IntList=Empty | Cons Int IntList

这基本上创建了2个数据构造函数函数:

> :t Empty
Empty :: IntList

> :t Cons
Cons :: Int -> IntList -> IntList
因此,第一个返回一个IntList类型,第二个需要2个参数(Int和IntList)并返回一个IntList

在绑定中,您只需部分应用
Cons
函数,只给它一个参数:

*Main> let x = Cons 3
这是要求你提供另一个完整类型的IntList。 现在,您可以通过两种方式获得IntList(因为此类型有两个构造函数):

对于第二个,b可以是空的,也可以是常数a'b':

Cons 3 (Cons 1 (Empty))

现在让我们更仔细地看一下第二种类型:

Cons Int ( Cons Int ( Cons Int ( IntList)))
记住Cons接受一个Int和一个IntList并返回一个IntList吗

Cons Int ( Cons Int ( IntList)) --Now doing the same we came up to
Cons Int (IntList) -- Once more
IntList 

这意味着我们的构造
Cons 3(Cons 2(Cons 1(Empty))
具有
IntList
的类型,并可用于在其上应用
intListProd
计算。

将“data IntList=Empty | Cons Int IntList”用作“data IntList=Empty | Cons Int”有什么用是相同的数据类型吗?@blue sky使用它可以通过嵌套多个cons单元格来表示任意大小的列表。后一种定义只允许列出零个或一个元素。“data IntList=Empty | Cons Int IntList”与“data IntList=Empty | Cons Int”有什么用途?blue sky使用它可以通过嵌套多个Cons单元格来表示任意大小的列表。后一种定义只允许列出零个或一个元素。因此,对于语句“data IntList=Empty | Cons Int IntList”,specificall“data IntList”部分定义了每个构造函数的返回类型,在本例中,IntList?@blue sky确切地说,data IntList是返回,Const Int IntList是函数“Const”它接受两个参数“Int”和“IntList”,并返回一个IntList(因为data IntList),因此对于语句“data IntList=Empty | Cons Int IntList”,specificall“data IntList”部分定义了每个构造函数的返回类型,在本例中,IntList?@blue sky正好是,data IntList是返回值,Const Int IntList是一个函数“Const”,它接受两个参数“Int”和“IntList”,并返回一个IntList(因为data IntList)