Generics Ramda'中的Curried函数定义;s流类型

Generics Ramda'中的Curried函数定义;s流类型,generics,functional-programming,flowtype,currying,ramda.js,Generics,Functional Programming,Flowtype,Currying,Ramda.js,Ramda的流类型具有以下特点: 其原因与类型差异有关。如果我说我一开始也不理解这一点,并解释我是如何通过实验来理解这一点的,这可能更有意义 在类型的定义中,唯一的区别是AA:A表示“AA正是A的一个类型或子类型”。所以我假设原因与如何将子类型视为函数的参数有关 因此,我使用该类型的更简单版本并将子类型作为参数传入,重新创建了一个简单示例: declare type MyCurriedFunction1<A, R> = & ((...r: [A]) => R) l

Ramda的流类型具有以下特点:


其原因与类型差异有关。如果我说我一开始也不理解这一点,并解释我是如何通过实验来理解这一点的,这可能更有意义

在类型的定义中,唯一的区别是
AA:A
表示“AA正是A的一个类型或子类型”。所以我假设原因与如何将子类型视为函数的参数有关

因此,我使用该类型的更简单版本并将子类型作为参数传入,重新创建了一个简单示例:

declare type MyCurriedFunction1<A, R> =
  & ((...r: [A]) => R)

let plus2: MyCurriedFunction1<number, number> = (x) => x+2;

let y: 1 | 2 = 1;
plus2(x);

我们没有得到任何类型错误

不管你的问题是什么,对于像curried函数这样的简单构造来说,这似乎相当复杂。我的意思是可变函数(带有一个rest参数)很难实现。参数多态参数很难实现。但从类型级别的角度来看,一元函数序列似乎非常简单。
  declare type CurriedFunction1<A, R> =
    & ((...r: [A]) => R)
declare type MyCurriedFunction1<A, R> =
  & ((...r: [A]) => R)

let plus2: MyCurriedFunction1<number, number> = (x) => x+2;

let y: 1 | 2 = 1;
plus2(x);
18: let plus2: MyCurriedFunction1<number, number> = (x) => x+2;
                                  ^ number. This type is incompatible with
21: plus2(x);
          ^ number enum (1 | 2)
declare type __CurriedFunction1<A, R, AA: A> =
    & ((...r: [AA]) => R)
declare type CurriedFunction1<A, R> = __CurriedFunction1<A, R, *>

let plus1: CurriedFunction1<number, number> = (x) => x+1;

let x: 1 | 2 = 1;
plus1(x);