【问题标题】:F# pattern matching errorF# 模式匹配错误
【发布时间】:2018-03-11 23:11:32
【问题描述】:

我尝试使用此代码将字符打乱为不同的字符并返回包含这些新字符的新列表。但是,我不断收到错误消息:第 3 行上的“一个列表但这里有类型字符”,第 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 []

【问题讨论】:

    标签: f#


    【解决方案1】:

    这是因为您将_scram 称为连接两个列表的(@) 运算符的第二个操作数,因此它推断整个表达式必须是一个列表。

    快速解决方法是将其包含在一个列表中:(P @ [_scram hd]),这样_scram hd 会被推断为一个元素(在本例中为一个字符)。

    然后你会发现你的下一个错误,包罗万象的通配符在引号中,即使没有,你也不能用它来绑定一个值以供以后使用。

    所以你可以把它改成| 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 []
    

    【讨论】:

    • 感谢您的帮助。因此,我假设 c -> c 如果不满足任何其他情况,则返回原始字符。对吗?
    • 没错。原始字符绑定到c(或您选择的任何其他名称)。您也可以使用| _ -> x,因为x 也包含原始值。
    【解决方案2】:

    F# 代码是按顺序定义的。第一个错误表明到目前为止的代码存在一些问题,即_scram 的定义。 | [] -> [] 行暗示 _scram 将列表带到列表中。下一行| 's' -> 'v' 暗示 _scram 将字符转换为字符。这是不兼容的,这解释了错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      相关资源
      最近更新 更多