[英]F# pattern matching error
我尝试使用此代码将字符加密为不同的字符,并返回包含这些新字符的新列表。 但是,我不断收到错误说:第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 []
那是因为你正在调用_scram
作为连接两个列表的(@)
运算符的第二个操作数,因此它推断整个表达式必须是一个列表。
一个快速解决方法是将它封装到一个列表中:( (P @ [_scram hd])
,这样_scram hd
被推断为一个元素(在本例中是一个char)。
然后你将发现你的下一个错误,catch-all通配符在引号中,即使它不会,你也不能用它来绑定一个值以便以后使用。
所以你可以把它改成| c -> c
| 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 []
F#代码是按顺序定义的。 第一个错误表明代码存在一些问题,即_scram的定义。 线| [] -> []
| [] -> []
表示_scram将列表带到列表中。 下一行| 's' -> 'v'
| 's' -> 'v'
意味着_scram将字符变为chars。 这是不兼容的,这解释了错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.