Ocaml - 表达式具有类型'列表 - > ' b列表但是表达式需要类型&b; b列表

时间:2017-11-16 16:29:18

标签: functional-programming ocaml

这是我的功能

> df
# A tibble: 11 x 2
   alpha      ar1
   <dbl>   <list>
 1  -0.5 <S3: ts>
 2  -0.4 <S3: ts>
 3  -0.3 <S3: ts>
 4  -0.2 <S3: ts>
 5  -0.1 <S3: ts>
 6   0.0 <S3: ts>
 7   0.1 <S3: ts>
 8   0.2 <S3: ts>
 9   0.3 <S3: ts>
10   0.4 <S3: ts>
11   0.5 <S3: ts>

> df$ar1 %>% lapply(head)
[[1]]
[1] -0.3514397  0.6665273  0.1932043 -0.5509680 -0.5857840 -0.6412465

[[2]]
[1] -1.3324151  0.9639404 -1.2454844  0.1048227 -0.4667547  1.2749614

[[3]]
[1] -0.2049486 -0.5751628  0.4895776  0.1538311  2.0552770 -1.3351100

[[4]]
[1] -0.1118248  0.4838552  2.7614692 -0.7824381  0.5151733  2.2416832

[[5]]
[1]  1.7293663  0.5335523 -0.4605581 -0.7785337  0.7875933 -0.8702821

[[6]]
[1]  1.15512596 -1.14722217  0.44119379  0.03748791  0.03285100 -0.05754903

[[7]]
[1]  0.5513116  1.4185419 -0.7616093  1.5258314  1.7186733 -0.9435652

[[8]]
[1] -1.0346102 -1.9515274  0.3263094 -0.9846696 -0.1100608  1.2949033

[[9]]
[1]  1.3427732  0.8074878 -2.0393332 -0.0580785  0.9315681  1.1272597

[[10]]
[1]  1.5801751  0.6694740  0.3058637 -0.8653836  0.3402794  1.3181050

[[11]]
[1]  1.7001214  2.8050716  0.6580970  3.0519142  2.3411307 -0.6577423

它还没有完成,但是我无法理解为什么我一直在助手([b :: hd])的标题中得到错误。我已经尝试过helper(b :: hd)或helper(b :: hd :: []),但都会出现错误。我如何才能使其有效?

2 个答案:

答案 0 :(得分:2)

使用function getTimeZone(){ var now = new Date().toString(); var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts timezone string return timeZone; }时,您将为函数的参数提供模式。但是您已经有一个名为function的参数。所以这个函数inputList期待两个参数(但忽略了第一个参数)。

您可以通过删除helper来解决此问题。

您对inputList的第一次递归调用也遇到问题。您的表达式helper是一个列表列表。我怀疑你想要更像[b :: hd]这里的东西。

至少还有一个问题,但我希望这有助于您入门。

答案 1 :(得分:1)

这里有多个错误。一个是关键字function意味着我们有一个隐含的参数,我们正在使用它。因此模式匹配发生在“不可见”参数上。但在这里你可能明确定义了一个:inputList。所以我们可以删除那个:

let rec helper = function
  | [] -> []
  | a :: b :: hd -> if a = b then helper ([b::hd]) else a :: helper (b:: hd)

接下来是类型有问题:在递归中,你使用:

  1. helper ([b::hd]);和
  2. a :: helper (b:: hd)
  3. 但是你把它们放在同一条线上,这没有任何意义,因为第一个传递元素列表列表,第二个传递元素列表。因此,第一个结果将是元素列表的列表,第二个结果是元素列表。合并这些是没有意义的。

    如果我理解你要确保不会出现两个相同的连续元素,那么我们应该将它重写为:

    let rec helper = function
      | [] -> []
      | a :: b :: hd -> if a = b then helper (b::hd) else a :: helper (b:: hd)

    您在此处定义了两种模式:

    1. 一个用于空列表;和
    2. 一个列表至少两个元素。
    3. 第二个将在列表b :: hd的尾部执行递归。这意味着最终当我们传递一个包含 n 元素的列表时,它将递归地处理带有 n-1 元素的列表, n-2 元素等。但最终它将有一个元素。而且没有这种情况。所以我们需要为一个元素模式添加一个案例:

      let rec helper = function
        | [] -> []
        | h :: [] -> h :: []
        | a :: b :: hd -> if a = b then helper (b::hd) else a :: helper (b:: hd)