gpt4 book ai didi

function - 了解函数的类型

转载 作者:行者123 更新时间:2023-12-02 21:46:30 24 4
gpt4 key购买 nike

我正在尝试理解函数的类型并能够解释它们。

两个函数:

insert :: t -> Bool -> ([t],[t]) -> ([t],[t])
insert a True (b,c) = (a:b,c)
insert a False (b,c) = (b,a:c)

partition :: (t -> Bool) -> [t] -> ([t],[t])
partition p [] = ([],[])
partition p (x : xs) = insert x (p x) (partition p xs)

根据我有限的知识,我认为插入功能:

  • insert 是 t 类型,它接受两个参数,其中一个是 bool,另一个是两个 t 类型列表的元组,并返回两个 t 类型列表的元组。

  • partition 是一个 t 类型的元组,它返回一个 bool,它接受一个 t 类型的列表作为参数,并返回一个由两个 t 类型的列表组成的元组。

这是正确的思考方式还是我理解错了?我一直在关注一些教程,这就是我到目前为止所理解的。

最佳答案

insert is of type t, it takes two arguments one of Bool and one of a tuple of two lists of type t and returns a tuple of two lists of type t.

。首先,值得注意的是,在 Haskell 中,每个函数都只接受一个参数。确实如此

insert :: t -> Bool -> ([t],[t]) -> ([t],[t])

是以下内容的简短形式:

insert :: t -> (Bool -> (([t],[t]) -> ([t],[t])))

事实上上面的内容仍然不是很冗长,规范的形式是:

insert :: ((->) t) (((->) Bool) (((->) ((,) ([] t)) ([] t))  ((,) ([] t)) ([] t)))

但是上面的内容当然不太可读,因此让我们坚持第二种形式。

Haskell 中的每个函数都只接受一个参数。这里发生的情况是,将参数应用于某个函数的结果会生成一个新函数。

因此,如果我们生成一个表达式 insert x ,我们构造了一个 Bool -> (([t], [t]) -> ([t], [t])) 类型的函数.

非正式地,有时确实会说“函数需要 n 个参数”。但记住这一点很重要。

其次,你忘记了 t 。我们可以非正式地说 insert接受三个参数,类型为 t 的值、一个 bool 值(类型 Bool )和一个包含两个 t 列表的 2 元组s。它将返回两个列表 t 的 2 元组s。取决于是否BoolTrueFalse它在两个列表之一前面加上给定的值。

例如:

Prelude> insert 5 False ([], [])
([],[5])
Prelude> insert 5 False ([1,4], [2,5])
([1,4],[5,2,5])
Prelude> insert 5 True ([1,4], [2,5])
([5,1,4],[2,5])
Prelude> insert 3 True ([1,4], [2,5])
([3,1,4],[2,5])
Prelude> insert 3 False ([1,4], [2,5])
([1,4],[3,2,5])

partition is a tuple of type t which returns a bool, and it takes a list of type t as it's argument and returns a tuple of two lists of type t.

不,这里的参数类型为 (t -> Bool)这是一个函数。事实上,在 Haskell 中你可以将函数作为参数传递。

非正式地我们可以说 partition接受一个“谓词”(将值映射到 Bool 的函数)和 t 列表s,它返回一个 2 元组,其中包含两个 t 列表s。根据谓词是否适用于列表中的值,这些值将排序在二元组的第一个或第二个列表中。

例如:

Prelude> partition (>3) [1,4,2,5]
([4,5],[1,2])
Prelude> partition (>3) [1,3,0,2]
([],[1,3,0,2])
Prelude> partition (>3) [1,7,8,0]
([7,8],[1,0])
Prelude> partition (>3) [1,7,8,9]
([7,8,9],[1])

关于function - 了解函数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56384112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com