我尝试使用此代码将字符加密为不同的字符,并返回包含这些新字符的新列表。但是,我不断收到错误说:第13行的“列表但是这里有类型字符”,第13行是“列表列表,但给出了一个字符列表”。不知道如何解决这个问题。在此先感谢您的帮助。
let _scram x =
match x with
| [] -> [] // line 3
| 's' -> 'v'
| 'a' -> 's'
| 'e' -> 'o'
| '_' -> '_'
let rec scramble L P =
match L with
| [] -> P
| hd::t1 -> scramble t1 (P @ (_scram hd))
let L =
let p = ['h'; 'e'; 'l'; 'l'; 'o'] //line 13
scramble p []
答案 0 :(得分:2)
那是因为你正在调用_scram
作为连接两个列表的(@)
运算符的第二个操作数,因此它推断出整个表达式必须是一个列表。
快速解决方法是将其封装到列表中:(P @ [_scram hd])
,这种方式_scram hd
被推断为元素(在本例中为char)。
然后你会发现你的下一个错误,catch-all通配符在引号中,即使它没有,你也不能用它来绑定一个值以便以后使用。
因此,您可以将其更改为| c -> c
。
然后你的代码将是这样的:
let _scram x =
match x with
| 's' -> 'v'
| 'a' -> 's'
| 'e' -> 'o'
| c -> c
let rec scramble L P =
match L with
| [] -> P
| hd::t1 -> scramble t1 (P @ [_scram hd])
let L =
let p = ['h'; 'e'; 'l'; 'l'; 'o']
scramble p []
答案 1 :(得分:1)
F#代码是按顺序定义的。第一个错误表明代码存在一些问题,即_scram的定义。行C-x e
表示_scram将列表带到列表中。下一行| [] -> []
表示_scram将chars作为chars。这是不兼容的,这解释了错误。