F#模式匹配错误

时间:2018-03-11 23:11:33

标签: f#

我尝试使用此代码将字符加密为不同的字符,并返回包含这些新字符的新列表。但是,我不断收到错误说:第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 []

2 个答案:

答案 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。这是不兼容的,这解释了错误。