@@ -2441,9 +2441,15 @@ class Why {
2441
2441
2442
2442
( ) = > {
2443
2443
// #86: lose generics in compose
2444
- let a : { [ index : string ] : string } = R . fromPairs ( [ [ '1' , 'A' ] , [ '2' , 'B' ] , [ '3' , 'C' ] ] )
2445
- let b : { [ index : string ] : string } = R . compose ( R . fromPairs ) ( [ [ 1 , 'A' ] , [ 2 , 'B' ] , [ 3 , 'C' ] ] )
2446
- let c : { [ index : string ] : string } = R . compose ( R . fromPairs ) ( [ [ '1' , 'A' ] , [ '2' , 'B' ] , [ '3' , 'C' ] ] )
2444
+ type so = { [ index : string ] : string } ;
2445
+ let pairs = [ [ '1' , 'A' ] , [ '2' , 'B' ] , [ '3' , 'C' ] ] ;
2446
+ let a1 : so = R . fromPairs ( [ [ '1' , 'A' ] , [ '2' , 'B' ] , [ '3' , 'C' ] ] )
2447
+ let a2 : so = R . fromPairs ( pairs ) ; // fails -- variable reduced to string[][], killing tuples
2448
+ let b1 : so = R . pipe ( R . fromPairs ) ( [ [ '1' , 'A' ] , [ '2' , 'B' ] , [ '3' , 'C' ] ] ) // fails, generics turn to {} => {}
2449
+ let c1 : so = R . compose ( R . fromPairs ) ( [ [ '1' , 'A' ] , [ '2' , 'B' ] , [ '3' , 'C' ] ] ) // fails, generics turn to {} => {}
2450
+
2451
+ // generics in pipe loses generics
2452
+ R . pipe ( R . identity )
2447
2453
}
2448
2454
2449
2455
( ) => {
@@ -2461,12 +2467,30 @@ class Why {
2461
2467
2462
2468
( ) = > {
2463
2469
// #92: lose generics in compose
2470
+
2471
+ // can't infer cond paths, must annotate:
2464
2472
const x : < T > ( v : T ) => T = R . cond ( [
2465
2473
[ R . F , R . F ] ,
2466
2474
[ R . T , R . identity ]
2467
2475
] ) ;
2468
- // ^ also can't infer cond paths
2469
- const y : ( v : number ) => number = R . compose ( x , R . inc ) ;
2476
+ // argument order matters for some reason...
2477
+ const y : ( v : number ) => number = R . pipe ( R . inc , x ) ; // ok
2478
+ const z : ( v : number ) => number = R . compose ( x , R . inc ) ; // boom
2479
+
2480
+ // don't use generics in pipe/compose/curry if it can't resolve them right away:
2481
+ let pipeF0 = R . pipe ( R . identity ) ; // : (v: {}) => {}
2482
+ let compF0 = R . compose ( R . identity ) ; // : (v: {}) => {}
2483
+
2484
+ // argument order matters too:
2485
+ let pipeF1 = R . pipe ( R . inc , R . identity ) ; // : (v: number) => number
2486
+ let compF1 = R . compose ( R . identity , R . inc ) ; // : (v: number) => {}
2487
+ let res2a : number = compF1 ( 1 ) ; // uh-oh, fails
2488
+
2489
+ // also can't reason backward:
2490
+ let compF2 = R . compose ( R . inc , R . identity ) ; // : (v: {}) => number
2491
+ let res3b : number = compF2 ( 'foo' ) ; // uh-oh, passes
2492
+ let pipeF2 = R . pipe ( R . identity , R . inc ) ; // : (v: {}) => number
2493
+ let res4b : number = pipeF2 ( 'foo' ) ; // uh-oh, passes
2470
2494
}
2471
2495
2472
2496
( ) = > {
0 commit comments