繁体   English   中英

F#模式匹配错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM