2014-02-05 41 views
0

所以我有几个问题,作为一个试图学习O'Caml的新手。一些OCAML的问题

在函数中,我经常看到|那是什么意思?另外,为什么函数定义为: let rec a = function 为什么它特别等于函数,然后代码?

然而,我的主要问题是,我试图写一个函数来计算一个元素存在于列表中的次数,所以如果我有1,5,5,6,9与目标val为5 ,那么我会返回2,如果目标val是9,那么我会返回1,因为它重复一次。

,这里是我的尝试,请告诉我,我做错了什么:

let rec track (x, l)= let rec helper(x,l, count) 
    in counthelper 
     match l with [] --> count 
    | (a::as) -> if(x = a) 
        then helper(as,l, count+1) 
       else count(as, l, count);; 

回答

0

通常|意味着pattern matching

let rec表示函数可以是递归的(自己调用)。 Tutorial

这是我的解决方案,其中一些有用的符号更改为_符号。让它成为你的锻炼:

let rec count y xs = 
    let rec inner n = function 
    | __ -> n 
    | ______________ -> inner (n+1) xs 
    | ____ -> inner n xs 
    in 
    inner 0 xs;; 

你的实现有一些问题。

  1. 最明显的是你在模式匹配中使用as。你不能在这种模式匹配我们的关键字。
  2. 您需要重新阅读有关函数声明的章节。看起来你正在将它与函数调用混合在一起。
  3. 您使用的不是咖喱饭功能。你以前在C做过一些,不是吗?
  4. 您在使用if时使用when更好。这种结构被称为guard
+0

我知道让rec可以递归,我不明白我上面的函数 – ShahrukhKhan

+0

@ user3276558有什么问题,我已经更新了答案。 – Kakadu

+0

当你让rec innner n = function,你为什么n = function,这让我困扰很多,我不明白。 – ShahrukhKhan

1

matchfunction关键字采取模式列表进行匹配。 |符号用于分隔不同的模式。这就是为什么它在OCaml代码中频繁出现。

function关键字就像是funmatch的缩写。它可以让你将一个函数定义为一组要与参数匹配的模式。

您的编号有let rec helper (x, l, count) in ...。这不是一个合适的let表达式。你想要这样的东西:let helper (x, l, count) = def in expr

更普遍的代码可能是这样的:

let track (x, l) = 
    let rec helper (x, l, count) = 
     ... definition of helper ... 
    in 
    helper (x, l, 0) 

作为一个边评论,您使用的元组函数的参数。这是更地道OCaml中使用钻营,即具有独立的参数的更多是这样的:

let track x l = 
    ... 

这让你做的部分应用程序(只指定的一些参数),也更干净语法。

更新

你最新的代码没有返回值,因为它有无限递归。

+0

谢谢你。根据你的建议,我已经更新了我的代码,但是我没有得到返回值。你可以看一看,我非常接近写我的第一次Ocaml函数。:) – ShahrukhKhan

+0

你的代码中有无限递归。您需要用较小的值递归调用自己。 (提示:列表尾部。) –

+0

谢谢,让我仔细考虑一下。请不要给我答案。我想学习。 – ShahrukhKhan