2009-07-20 10 views
1

とのマッチングのF#のパターンは、私はIsParentRootの値を設定したい「0」入力が「0」か、もしそうでなければ、いくつかのコードを実行している場合:ラムダ

let isParentRoot parVal = 
     match parVal with 
     | "0" -> "0" 
     | x -> (fun x -> 
      "something") 

私はこれをしようとしているが、これはコンパイルされません。 "This function takes too many arguments, or is used in a context where a function is not expected"というエラーが表示されます。何か案が? ありがとう

答えて

3

コンパイルするために関数に引数を指定する必要はありませんか?

let isParentRoot parVal = 
    match parVal with 
    | "0" -> "0" 
    | x -> (fun y -> "something") x 

のようなものをそう、最後の試合は、最初のものは文字列を返すだろうが、文字列を返す関数を返すしようとするだろうからです。両方を混ぜることはできません。

しかし、ここであなたのアプローチが間違っている可能性があります。関数は値を返します(またはunit)。明示的に何かを変更したいのであれば、一般的な機能イディオムは、変更したいものを変更したところで新しい値を返すことです。副作用を伴うプログラミング( "0"に設定すると、fooとなっても、もしそうでなければ完全にそうでないとすれば)は、ほとんどFP以外のものです。しかし、私はまだF#の初心者で、2日前に言語を調べ始めるので、私はここで間違っているかもしれません。

+0

は、あなたが Xを書くことができるかもしれそれは、x変数 – sthiers

+0

上の曖昧さを取り除くか、使用でき をX |それは明らかにあなたのことを確認するために>次の関数でパターンマッチした値を使用しています: | x - > x |>(fun y - > "something") – dahlbyk

+0

スコープのためにあいまいさはありませんが、他の人にはもっと簡単になるかもしれないので変更しました:) – Joey

1

あなたは、私はあなただけで書くことができると信じて、この時点でラムダを定義する必要はありません。

let isParentRoot parVal = 
    match parVal with 
    | "0" -> "0" 
    | x -> CODE BLOCK 
      GOES HERE 

すなわちリストにXを追加し、リストを読み出す(ちょうどそうで意味のあるコードがありますここに)あなたはちょうど書くことができる:

let isParentRoot parVal = 
    match parVal with 
    | "0" -> "0" 
    | x -> let roots = List.append oldroots x 
      List.iter (fun r -> printfn "root: %s" r.ToString()) roots 

あなたが以前にあなたのoldrootsリストを定義していると仮定します。

+0

それが動作するための文字列ですか? – Joey

+0

はい、そうです。ドゥー! – Massif

2

関数のすべての可能な戻り値は同じ型でなければなりません。だからあなたのケースは、1つのブランチでStringを返すので、他のブランチでは関数を返すので動作しません。

これは動作します:

 
let isParentRoot parVal = 
     match parVal with 
     | "0" -> (fun _ -> "0") 
     | x -> (fun _ -> "something") 

あなたが本当にあなたのケースは、あなたがオブジェクトに戻り値の両方をアップキャスト可能性が仕事をしたい場合。 >(楽しいY - - >「何か」)の例を明確にするため