Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_Search_Haskell - Fatal编程技术网

List 替换Haskell中列表列表中的元素

List 替换Haskell中列表列表中的元素,list,search,haskell,List,Search,Haskell,我有一个这样的列表: [["BBBBBBBB", "BWFFFPFGB", "BWFFFPFGB", "BWFFMPFGB", "BWFFFPF_B", "BWFFFPF6B", "BBBBBBB"]] 我做了一些研究,发现了如何使用访问单个元素操作员。但是当涉及到搜索某个元素时,我不知道该怎么做。我的朋友说我需要在列表中使用类似(x:xs):xss的东西,但当我在WinGHCi haskell程序中尝试时,我得到了这个 Prelude> let list =

我有一个这样的列表:

[["BBBBBBBB",
  "BWFFFPFGB", 
  "BWFFFPFGB",
  "BWFFMPFGB",
  "BWFFFPF_B",
  "BWFFFPF6B",
  "BBBBBBB"]]
我做了一些研究,发现了如何使用
访问单个元素操作员。但是当涉及到搜索某个元素时,我不知道该怎么做。我的朋友说我需要在列表中使用类似
(x:xs):xss
的东西,但当我在WinGHCi haskell程序中尝试时,我得到了这个

Prelude> let list =    [["BBBBBBBB",
  "BWFFFPFGB", 
  "BWFFFPFGB",
  "BWFFMPFGB",
  "BWFFFPF_B",
  "BWFFFPF6B",
  "BBBBBBB"]]


Prelude> head(x:xs):xss
<interactive>:192:2: Not in scope: `x'
<interactive>:192:4: Not in scope: `xs'
<interactive>:192:8: Not in scope: `xss'
Prelude>let list=[[“BBBBBBBB”,
“BWFFFPFGB”,
“BWFFFPFGB”,
“BWFFMPFGB”,
“BWFFFPF_B”,
“BWFFFF6B”,
“bbbbb”]]
前奏曲>头(x:xs):xss
:192:2:不在范围内:`x'
:192:4:不在范围内:`xs'
:192:8:不在范围内:`xss'
我知道我将名称声明为
list
而不是
x:xs
,但即使我将其声明为
x:xs
,我仍然会收到错误。我对haskell可能还是有点陌生,无法真正理解该怎么做,所以我可能走错了这条路

我看了这里,因为最终我想用一些不同的东西替换
M
,但我不完全确定如何实现它


感谢您的帮助/指导,谢谢

首先,Haskell中几乎所有的“变量”都是不可变的,因此没有“更改列表”,只有修改过的副本

其次,您需要根据某些条件查找元素。要做到这一点,你需要遍历一个列表这可以使用递归实现。可以使用作为遍历函数的参数传递的函数进行过滤(此函数必须接受元素并返回布尔值)

试着将以上内容结合起来,形成自己的功能。从类型签名开始,它显示了您想要做的事情:获取一个Char列表(最好是泛型类型)和一个可能更改元素并返回修改列表的函数:

replaceFunc::(字符->字符)->字符串->字符串


另外,请阅读,这里有一个提示,说明如何仅对特定元素应用某些函数。

首先,让我们看看如何将
W
替换为
M

charWM :: Char -> Char
charWM 'W' = 'M'  -- If you see W, put M.
charWM x  =  x   -- If you see anything else, put it back as is.
您可以通过添加其他字母转换来重写该函数

现在让我们在一个列表上完成这项工作。有一个很棒的函数
map::(a->b)->[a]->[b]
可以让你在列表中的每个元素上应用一个函数

stringWM :: String -> String
stringWM xs = map charWM xs  -- do charWM to everything in xs.
例如
stringWM“QWERTY将赢得”
=
“QMERTY MILL MIN”

接下来,我们可以对列表列表执行此操作:

lolWM :: [String] -> [String]
lolWM xss = map stringWM xss
String
[Char]
的类型同义词)
让我们在ghci中测试一下:

*Main> list'
["BBBBBBBB","BWFFFPFGB","BWFFFPFGB","BWFFMPFGB","BWFFFPF_B","BWFFFPF6B","BBBBBBB"]
*Main> lolWM list'
["BBBBBBBB","BMFFFPFGB","BMFFFPFGB","BMFFMPFGB","BMFFFPF_B","BMFFFPF6B","BBBBBBB"]
一切都好

您的示例并不是确切的
list'
,而是
[list']
,它有一个元素,所以要处理这个问题,我们需要
映射lolWM
。通常,我们不会费心编写
stringWM
lolWM
,直接进入列表列表,如果我们需要的话:

lololWM = (map.map.map) charWM
map.map.map
表示地图的地图。你可以让它稍微让你大吃一惊,或者你可以只说一个字符列表的列表,所以映射-每个列表级别一个映射


将来,您可能希望用字符串而不是字符来替换
W

rewriteChar :: Char -> String
rewriteChar 'W' = "--^--"
rewriteChar  x  = [x] -- put x in a list to make it a string
这一次,地图是不够的:
map rewriteChar“QWERTY会赢”
gives

["Q","--^--","E","R","T","Y"," ","--^--","I","L","L"," ","--^--","I","N"]
我们可以在上面使用
concat
将其展平为一个列表,但这样做更有趣

rewriteString = concatMap rewriteChar
所以现在
rewriteString“QWERTY将获胜”
给我们
“Q--^--ERTY--ILL--^--IN”


要想尝试更多令人兴奋的东西,我建议您了解基本语法,可以使用
“QWERTY将赢得”>>=rewriteChar
“你好,妈妈”>=\x->[x,x,x]

。读完前几章后,你应该能够弄清楚你想要什么。head(x:xs):xss没有意义。谢谢你,这正是我想要的。我的一个问题是,我将如何修改它,以使其中一个字符串将“M”替换为“W”?