2016-09-16 13 views
0

Ramdaを使用して簡単なアプリケーションを構築しています。RamdaでArgを2回呼び出す

私は不必要に不合理な機能であると思われるものを作成せずに対処する方法がわからないという機能的な構成の問題にぶつかってきました。

シナリオ:

私はオブジェクトとしてパラメータを渡しています。そここのオブジェクト上の2つの属性があり、それ以外の問題に関連していないいくつかの他のものは、私はそれが国の変更ではないしたい:私は変換することができ、単一のarg機能を持っている

{locCode :<string>, LocationList : [<Location>], someOtherParams : ... } 

場所にlocCode: fetchLocByCode

ここに私の望ましい結果がオブジェクトの上に何かに触れることなく、locCode値をとるfetchLocByCodeに渡し、結果をLocationListを追加し、新しいLocationListで新しいオブジェクトを返すようになります。

何かがanalagousへ:私はこれは非常にばかげやって書いてしまったと私は恐ろしく間違って何かを行っていると信じて私をリードしました何

(Param)=>{ 
Param.LocationList.push(fetchLocByCode(Param.locCode)); 
return Param; 
} 

const locListLens = R.lens(R.prop('LocationList'),R.assoc('LocationList')) 
const appendLocList = (i)=>R.compose(R.over(locListLens),R.append,fetchLocByCode,R.prop('locCode'))(i)(i) 

このソリューション "私はいくつかの基本的なアイデアを逃したように見えます。

このシナリオに対処するために、より「標準的な」方法を提示したい人はいますか?

答えて

3

のは、あなたの最初のバージョンを見てみましょう:

Param => { 
    Param.LocationList.push(fetchLocByCode(Param.locCode)); 
    return Param; 
} 

私は非常に多くの変異は必要ありません願っています。のは、それを削除してみましょう:

Param => 
    R.assoc('LocationList', 
      R.append(fetchLocByCode(Param.locCode), Param.LocationList), 
      Param) 

私たちは二度LocationListプロパティにアクセスしないようにするためのレンズを使用することができます。

Param => 
    R.over(R.lensProp('LocationList'), 
     R.append(fetchLocByCode(Param.locCode)), 
     Param) 

は、我々は完全にParamを取り除くだろうか? R.convergeを使用して起動してみましょう:

R.converge(R.over(R.lensProp('LocationList')), 
      [Param => R.append(fetchLocByCode(Param.locCode)), 
      R.identity]) 

はのは、最初の分岐関数からParamを削除するR.composeを使用してみましょう:

R.converge(R.over(R.lensProp('LocationList')), 
      [R.compose(R.append, fetchLocByCode, R.prop('locCode')), 
      R.identity]) 

あなた自身があなたがSコンビネータのために使用することを発見したR.converge(f, [g, R.identity])を書いて見つけるの任意の時間を!

S.S(R.flip(R.over(R.lensProp('LocationList'))), 
    R.compose(R.append, fetchLocByCode, R.prop('locCode'))) 

これはきちんとしていますが、R.assocバージョンは問題ありません。今後の読者は、S.S(R.flip(R.over(R.lensPropの感覚を覚える必要はありません。 ;)

+0

ありがとう! あなたの例は、これがもっと意味を成すのを助けます - 私は本当にポイントフリーで滞在しようと迷っていて、プロパティに直接アクセスすることはまだ完全に可能であることを忘れていました。 –

関連する問題