2017-11-15 5 views
0

私はこれを解決する必要があります。関数を記述します( 'a listl = Empty |' a listl * 'aのリスト)。 私はリストなしで試合をしたことはありません。 matchを整数として使用するのは非常に混乱します。関数型のocamlとのマッチの使い方?

type 'a listl = Empty | Cons of 'a listl * 'a  

var: int -> (int -> 'a) ->'a listl 

tabu 5 (fun x -> x^x) => [0;1;9;16;25] 

このような結果が出てきます。

type 'a listl = Empty | Cons of 'a listl * 'a  

let rec tabu n f = 
match n with 
| 0 -> 
| n -> if n > 0 then f n :: (tabu (n-1) f) else Empty 
;; 

「Empty、Cons」の代わりに「0、n」を使用するにはどうすればよいですか? 良いアイデアはありますか?

+2

:だから

if n=m then ... else ... 

かそこらのようなwhen句を使用しなければなりません。問題を理解する前に問題を解決しようとすると、別の問題の解決策に終わる可能性が高くなります。それは楽しいかもしれませんが、おそらく生産的ではありません。なぜあなたはそこでの試合が必要だと思いますか? – glennsl

答えて

2

私が正しく理解している場合は、タイプintの値の照合方法を尋ねています。あなたは、パラメータnが値0または他のいくつかの値を持っているかどうかを区別したい場合は、そのようにそれを行うことができます。

match n with 
| 0 -> ... 
| _ -> ... 

をアンダースコアは任意の値に一致する匿名のワイルドカードパターンです。 (しかし、このmatchで、それは0とは一致しません最初のパターンが優先されるため。)この場合、あなたはそのようなifと同じことを実現することができます:あなたが何かをnを比較したい場合は

if n=0 
then ... 
else ... 

一定ではない、mと言うことは、元の結合としてm使用していないので、あなただけの

match n with 
| m -> ... 

を行うことはできません。代わりにmを非匿名のワイルドカードパターンとして扱い、パターンの後の式にnの値を持つmの新しいバインディングを導入します。私はあなたがより明確にあなたの問題を説明する必要があると思う

match n with 
| _ when n=m ->