Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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
List Haskell:获取列表列表并将其分解为多个单个列表(而不是串联)_List_Haskell - Fatal编程技术网

List Haskell:获取列表列表并将其分解为多个单个列表(而不是串联)

List Haskell:获取列表列表并将其分解为多个单个列表(而不是串联),list,haskell,List,Haskell,这是一个非常基本的问题,我知道,我是哈斯克尔的乞丐。因此,我想知道如何从以下函数中“获取”列表: putStr( f [[1,2,3],[4,5,6],[6,7,8]]) 我不知道我是否正确地表达了这一点,但我想创建一个函数f,它采用以下类型: type Matrix a = [[a]] type IntMat = Matrix Integer 然后在矩阵的每一行上做一些事情,包括内部列表 问题是,我不太确定如何称呼他们!:s 如果我没有任何意义,请让我解释 提前谢谢你 如果要获取第i行,则

这是一个非常基本的问题,我知道,我是哈斯克尔的乞丐。因此,我想知道如何从以下函数中“获取”列表:

putStr( f [[1,2,3],[4,5,6],[6,7,8]])
我不知道我是否正确地表达了这一点,但我想创建一个函数f,它采用以下类型:

type Matrix a = [[a]]
type IntMat = Matrix Integer
然后在矩阵的每一行上做一些事情,包括内部列表

问题是,我不太确定如何称呼他们!:s 如果我没有任何意义,请让我解释


提前谢谢你

如果要获取第i行,则可以使用
(!)
运算符

Prelude> [[1, 2], [3]] !! 1
[3]
Prelude> [[1, 2], [3]] !! 0
[1,2]
Prelude> 
如果要对每一行应用任何函数,则可以使用
map

Prelude> map length[[1, 2], [3]]
[2,1]
“查找每个内部列表的最大值”、“查找它们的长度以便以后使用”,这两个操作都可以通过
map
高阶函数完成

Prelude> let a = [[1,2,3],[4,5,6],[6,7,8]] :: [[Integer]]
Prelude> map maximum a
[3,6,8]
Prelude> map length a
[3,3,3]

如果您有一个列表
M=[a,b,c,d,…]
,并且您希望使用函数
f
将列表转换为
N=[f(a),f(b),f(c),f(d),…]
,那么您可以使用函数
map
N==map f M
)。

您正在寻找的函数是
map
。例如:

>>> map maximum [[1,2,3],[4,5,6],[6,7,8]]
[3,6,8]

f::[Int]->a
成为您想要对
IntMat
的每一行执行的函数

然后,您可以使用
map
将其应用于矩阵的每一行:
putStr$map f[[1,2,3],[4,5,6],[6,7,8]
将列表的每个元素传递到
f
并返回一个新列表,其中第一个元素是
f firstElement
的结果,第二个元素是
f secondElement
的结果,地图定义为

map :: (a -> b) -> [a] -> [b]
map f []     = []
map f (x:xs) = f x : map f xs
例如,要增加每个元素,请执行以下操作:

incElem :: Int -> Int
incElem x = x + 1

incRow :: [Int] -> [Int]
incRow row = map incElem row

incMat :: IntMat -> IntMat
incMat mat = map incRow mat
(请注意,这通常会写得更简洁,如
incMat=map.map$(+1)
——您不必在开始时理解这一点,仅供参考)

当然,
f
的结果不必是列表。如果它的类型是
[Int]->String
,那么
map f
就是
[[Int]]->[String]
。当然,参数和结果必须是一个列表。

我想您需要
(map.map)
。如果我理解正确,您希望对子列表的每个元素执行一些操作并返回一个新列表

首先,让我们看看(map.map)是什么:

我认为这是不言自明的

让我们在一个示例中使用它:

Prelude> (map . map) (+1) [[1..3],[4..7],[8..10]]
[[2,3,4],[5,6,7,8],[9,10,11]]
因此,在本例中,我们将函数
(+1)
应用于子列表的每个元素,并返回一个与旧列表具有相同“形状”的新列表,但包含更新的元素



编辑:我误解了。这在嵌套列表的最内部元素上运行,而不是嵌套列表本身。

我不明白,您想对内部列表执行什么“操作”?“执行一些操作”什么操作?查看
map
-这是一个很好的开始函数。例如,您正在尝试查找每个内部列表的最大值。或者找到它们的长度以便以后使用。你会怎么做?
Prelude> (map . map) (+1) [[1..3],[4..7],[8..10]]
[[2,3,4],[5,6,7,8],[9,10,11]]