回答編集履歴

3

おまけのおまけを追加

2018/04/11 11:29

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -4,23 +4,7 @@
4
4
 
5
5
 
6
6
 
7
- それ以外の使い方は質問文通りで良いんじゃないでしょうか?
8
-
9
- 多分R.pickAllの戻り値が関数だったのでパニックになっただけだと思います。
10
-
11
-
12
-
13
- 下記のパイプライン演算子を今のJSの機能で擬似的に再現したのがRamda.jsのR.pipeです。
14
-
15
- [ES Nextのパイプライン演算子ってどうなの? - Qiita](https://qiita.com/miyabisun/items/6fde1288b664264300aa)
16
-
17
-
18
-
19
- ---
20
-
21
-
22
-
23
- 因みに質問文のargumentsやthisが宣言されてないのは、
7
+ 質問文のargumentsやthisが宣言されてないのは、
24
8
 
25
9
  アロー関数はこれらの暗黙的な変数を作らないからです。
26
10
 
@@ -82,9 +66,9 @@
82
66
 
83
67
  ```JavaScript
84
68
 
85
- const main = (data2, data) => R.pipe(
69
+ const main = R.pipe(
86
70
 
87
- R.pickAll(data2),
71
+ R.pickAll,
88
72
 
89
73
  R.values,
90
74
 
@@ -108,6 +92,54 @@
108
92
 
109
93
  R.product
110
94
 
111
- )(data)
95
+ )
112
96
 
113
97
  ```
98
+
99
+
100
+
101
+ ---
102
+
103
+
104
+
105
+ 【おまけのおまけ】
106
+
107
+
108
+
109
+ ポイントフリースタイルはかっこいいですが、
110
+
111
+ 潔癖になりすぎるとキモいコードになってしまいます。
112
+
113
+ 特に出入り口の型は意味不明にならないように気をつけてくださいね!
114
+
115
+
116
+
117
+ 引数や型はこんな感じでコメントで明示したり、
118
+
119
+ 引数2つとる関数で包んでおいたほうが後々のコードリーディングで楽だと思います。
120
+
121
+ 今回は両方の対応してますが、片方だけでも良いと思います。
122
+
123
+
124
+
125
+ ```JavaScript
126
+
127
+ // この書き方はHaskellの書式を参考にしています。Ramda.jsのドキュメントでも関数名タイトルのすぐ下に同じ表記の物がありますね。
128
+
129
+ // main :: Array -> Object -> Number
130
+
131
+ const main = R.curry((data2, data) => R.pipe(
132
+
133
+ R.pickAll(data2),
134
+
135
+ R.values,
136
+
137
+ R.sum,
138
+
139
+ R.repeat(R.__, 2),
140
+
141
+ R.product
142
+
143
+ )(data))
144
+
145
+ ```

2

R.pipeのくだりが嘘になってたので削った

2018/04/11 11:29

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -1,163 +1,3 @@
1
- もうダメな箇所が目に見えてるので直接切り込みますが、
2
-
3
- 今回の不具合の件は矢印の箇所でしょうね。
4
-
5
-
6
-
7
- ```JavaScript
8
-
9
- const main = R.pipe( // <- ここと
10
-
11
- R.pickAll, // <- ここ
12
-
13
- R.values,
14
-
15
-
16
-
17
- R.tap(v => {
18
-
19
- // 処理中の値を見たい
20
-
21
-
22
-
23
- // console.log(v)
24
-
25
- // console.log(arguments)
26
-
27
- // console.log(this)
28
-
29
- // console.log(R.__);
30
-
31
- }),
32
-
33
- R.sum,
34
-
35
- myFunc,
36
-
37
- );
38
-
39
- ```
40
-
41
-
42
-
43
- R.pickAllは2つの引数をカリー化で待ち受ける関数です。
44
-
45
- なので発火するためには2つの引数が必要です。
46
-
47
-
48
-
49
- R.pipeには1個しか引数を設定できないので、
50
-
51
- R.pickAllにdata2だけ飛び込んで、data変数はどっかに消えているんじゃないでしょうか?
52
-
53
- だからR.pickAll(data2)の結果、つまり後1個引数よこせ状態の関数が返ってきて、次のR.valuesに進んでいます。
54
-
55
-
56
-
57
- ここは`R.pickAll(data2)`と1個だけ先に束縛して、
58
-
59
- 次のdataがやってくるのを待ち受ける仕組みにしましょう。
60
-
61
-
62
-
63
- ```JavaScript
64
-
65
- const main = R.pipe(
66
-
67
- R.pickAll(data2), // 予め1個は設置しておく
68
-
69
- R.values,
70
-
71
-
72
-
73
- R.tap(v => {
74
-
75
- // 処理中の値を見たい
76
-
77
-
78
-
79
- // console.log(v)
80
-
81
- // console.log(arguments)
82
-
83
- // console.log(this)
84
-
85
- // console.log(R.__);
86
-
87
- }),
88
-
89
- R.sum,
90
-
91
- myFunc,
92
-
93
- );
94
-
95
-
96
-
97
- main(data) // 引数1個で発火
98
-
99
- ```
100
-
101
-
102
-
103
- 引数2個でやらざるを得ないなら、
104
-
105
- 引数2個を受ける関数を外側で作って受けるべきです
106
-
107
- まぁ、こっちの方が引数2個ほしいよという宣言にもなるので分かりやすいんじゃないですかね?
108
-
109
-
110
-
111
- pipeの宣言即実行したい時が悩ましくて、ダサいというか
112
-
113
- 発火する変数が一番下に行っちゃってなんか微妙になりますけどね。
114
-
115
-
116
-
117
- ```JavaScript
118
-
119
- const main = (data2, data) => R.pipe(
120
-
121
- R.pickAll(data2),
122
-
123
- R.values,
124
-
125
- R.tap(v => {
126
-
127
- // 処理中の値を見たい
128
-
129
- // console.log(v)
130
-
131
- // console.log(arguments)
132
-
133
- // console.log(this)
134
-
135
- // console.log(R.__);
136
-
137
- }),
138
-
139
- R.sum,
140
-
141
- myFunc,
142
-
143
- )(data)
144
-
145
-
146
-
147
- main(data2, data)
148
-
149
- ```
150
-
151
-
152
-
153
- ---
154
-
155
-
156
-
157
- さて、質問に答えます。
158
-
159
-
160
-
161
1
  `R.tap`はよほどの事がない限り、基本的には`R.tap(console.log)`を好きな箇所に挿入して使う感じになります。
162
2
 
163
3
  どうせ基本的には第一引数以外見ませんからね。
@@ -173,6 +13,24 @@
173
13
  下記のパイプライン演算子を今のJSの機能で擬似的に再現したのがRamda.jsのR.pipeです。
174
14
 
175
15
  [ES Nextのパイプライン演算子ってどうなの? - Qiita](https://qiita.com/miyabisun/items/6fde1288b664264300aa)
16
+
17
+
18
+
19
+ ---
20
+
21
+
22
+
23
+ 因みに質問文のargumentsやthisが宣言されてないのは、
24
+
25
+ アロー関数はこれらの暗黙的な変数を作らないからです。
26
+
27
+ これはES2015の罠なのでハマったら思い出してください。
28
+
29
+
30
+
31
+ `R.tap(function(){ console.log(arguments) })`という風に明示的に書けばアクセス出来るでしょう。
32
+
33
+ まぁ、見たところでpipeは戻り値1個を持って返ってきて、次の関数を引数1個で叩く設計なのであんまり意味ないと思いますけど。
176
34
 
177
35
 
178
36
 

1

おまけ追加

2018/04/11 11:20

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -173,3 +173,83 @@
173
173
  下記のパイプライン演算子を今のJSの機能で擬似的に再現したのがRamda.jsのR.pipeです。
174
174
 
175
175
  [ES Nextのパイプライン演算子ってどうなの? - Qiita](https://qiita.com/miyabisun/items/6fde1288b664264300aa)
176
+
177
+
178
+
179
+ ---
180
+
181
+
182
+
183
+ 【おまけ】
184
+
185
+
186
+
187
+ ```JavaScript
188
+
189
+ // 自作のメソッド
190
+
191
+ const myFunc = v => v * v
192
+
193
+ ```
194
+
195
+
196
+
197
+ これは効率はともかくRamda.jsで作れますね。
198
+
199
+ 俗に言うポイントフリースタイルってやつです。
200
+
201
+
202
+
203
+ ```JavaScript
204
+
205
+ const myFunc = R.pipe(
206
+
207
+ R.repeat(R.__, 2),
208
+
209
+ R.product
210
+
211
+ )
212
+
213
+ console.log(myFunc(10)) // 100
214
+
215
+ console.log(myFunc(12)) // 144
216
+
217
+ ```
218
+
219
+
220
+
221
+ なのでmyFuncを消しちゃってこういう風にしても同じ動きすると思いますよ。
222
+
223
+
224
+
225
+ ```JavaScript
226
+
227
+ const main = (data2, data) => R.pipe(
228
+
229
+ R.pickAll(data2),
230
+
231
+ R.values,
232
+
233
+ R.tap(v => {
234
+
235
+ // 処理中の値を見たい
236
+
237
+ // console.log(v)
238
+
239
+ // console.log(arguments)
240
+
241
+ // console.log(this)
242
+
243
+ // console.log(R.__);
244
+
245
+ }),
246
+
247
+ R.sum,
248
+
249
+ R.repeat(R.__, 2),
250
+
251
+ R.product
252
+
253
+ )(data)
254
+
255
+ ```