2012-05-09 11 views
4

Iは、F#にOCamlのに基づいていくつかのモジュールを変換し、[x; y; z]は、機能のリストを返しmap func1 ["a"; "b"; "c"]識別子と のリストである。このOCamlをF#に変換する:F#で値のリストを直接識別子のリストにマップできますか?

let [x; y; z] = map func1 ["a"; "b"; "c"] 

のようなものに走っています。

は現在、私は別にすなわち識別子にリスト内の各値を結合してい

let fList = map func1 ["a"; "b"; "c"] 
let x = fList.[0] 
let y = fList.[1] 
let z = fList.[2] 

識別子の使用は、第二の機能、私は私が関数func2を変更することができます知っている、すなわち

func2 x y z 

のためでありますリストを受け入れることができますが、実際にはfunc2は各パラメータの各関数とともに値をとるため、さらに多くの作業が必要になります。すなわち

func2 (x g) (y h) (z i) 

私はOCamlのよう効率的にこれを行う方法を見て、空思い付いています。 unmap、deconstructを検索し、メソッドを見てくださいList

F#は値のリストを直接識別子のリストにマップできますか?私は変換しています

EDIT

コードは、独自のライブラリ内のmap関数を定義しません。

EDIT

@OnorioCatenacciは、それは私が代わりに実際の作業例を作成する多くの分を過ごすしようとしているの例として書いただけのものでした。実際のコードには著作権があるため、完全な開示がなければここでは使用できません。私が作ろうとしていたことは、識別子に定数値を代入していなかったのですが、識別子に関数を割り当てることでした。私はmap func1 ["a"; "b"; "c"]を入れて、関数がいくつかの入力に基づいて必要に応じて生成され、ハードコードされていないことを示しました。実際のコードは論理回路シミュレータを構築し、返される関数は異なる論理回路である。コンビネータを考える。それはすべて自動化された定理証明者の一部です。トマスとダニエルは質問を理解し、私が実際のコードで確認した正解を返しました。

つまり、func1 "a"は、パラメータ"a"を使用して関数を返します。 map func1 ['a", "b", "c"]は関数のリストを返します。関数はF#のfirst-classなので、値として返すことができます。

+0

こんにちはガイ - 何かについてちょうど好奇心: - 長さを固定している - とあなた自身のmap関数を定義トマスは言及警告、あなたはタプルを使用することができ、「不完全なパターンが一致した」避けたいです。 'map func1 ["a"; "b"; "c"]は関数のリストを返します。その呼び出しはリストを返さないでしょうか?関数のリストではない明白なリスト?私のためにもう少し説明していただけますか?私はちょうどあなたに従っているわけではないと私はあなたが言っていることを理解したいと思います。 –

+0

@OnorioCatenacci編集を参照してください。 –

+0

さらなる説明をありがとう。私は何かが欠けているに違いないことを知っていた。 –

答えて

7

マップをリストに適用し、パターンマッチングを使用して要素をF#の識別子にバインドすることができます。構文は、あなたが書いたサンプルと全く同じです。

let [x; y; z] = List.map func1 ["a"; "b"; "c"] 

この例の唯一の問題点は、F#コンパイラは、静的結果は長さ3のリストになりますので、それがあなた与えることを確認することができないということです"この式で不完全なパターンが一致します。"この例では、実際には実行できませんが、たとえば、mapを誤って再定義して最初の要素を捨てると、コードが壊れてしまいます。

あなたはそれを無視することができますが、あなたはそれを避けたい場合は、あなたがmatchを使用すると、予期しない場合にはいくつかのカスタム例外をスローする必要がありますので、これは、単なる警告である:

match List.map func1 ["a"; "b"; "c"] with 
| [x; y; z] -> 
    // Continue here if the pattern matching does not fail 
    func2 (x g) (y h) (z i) 
| _ -> invalidOp "Pattern matching failed" 
+0

それはうまくいった。 :) –

+0

パターンマッチングでうまく拡張された解答。 :) –

+0

同じ警告がOCaml – newacct

6

あなたの場合

module Tuple3 = 
    let map f (a, b, c) = (f a, f b, f c) 

let x, y, z = Tuple3.map func1 ("a", "b", "c") 
+0

で発生しました。 :) –

関連する問題