ããã¯ããžã§ããªãã¯ãåãã©ã¡ãŒã¿ãŒãšããŠèš±å¯ããããã®ææ¡ã§ãã çŸåšãã¢ããã®å ·äœäŸãæžãããšã¯å¯èœã§ããããã¹ãŠã®ã¢ãããæºè¶³ããã€ã³ã¿ãŒãã§ãŒã¹ãæžãããã«ãæžãããšãææ¡ããŸãã
interface Monad<T<~>> {
map<A, B>(f: (a: A) => B): T<A> => T<B>;
lift<A>(a: A): T<A>;
join<A>(tta: T<T<A>>): T<A>;
}
åæ§ã«ããã«ã«ãé¢æã®å ·äœäŸãæžãããšãå¯èœã§ããããã¹ãŠã®ãã«ã«ãé¢æãæºè¶³ããã€ã³ã¿ãŒãã§ãŒã¹ãæžãããã«ãæžãããšãææ¡ããŸãã
interface Cartesian<T<~>> {
all<A>(a: Array<T<A>>): T<Array<A>>;
}
ãã©ã¡ããªãã¯åãã©ã¡ãŒã¿ãŒã¯ãä»»æã®æ°ã®åŒæ°ãåãããšãã§ããŸãã
interface Foo<T<~,~>> {
bar<A, B>(f: (a: A) => B): T<A, B>;
}
ã€ãŸããåãã©ã¡ãŒã¿ãŒã®åŸã«ãã«ããšèªç¶ã¢ãªãã£ãç¶ãå Žåãåãã©ã¡ãŒã¿ãŒã¯ã宣èšã®æ®ãã®éšåã§ãæå®ãããã¢ãªãã£ãæã€ãžã§ããªãã¯åãšããŠäœ¿çšã§ããããã«ããå¿ èŠããããŸãã
çŸåšã®å Žåãšåæ§ã«ããã®ãããªã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããå Žåã¯ããžã§ããªãã¯åãã©ã¡ãŒã¿ãŒã次ã®ããã«å ¥åããå¿ èŠããããŸãã
class ArrayMonad<A> implements Monad<Array> {
map<A, B>(f: (a:A) => B): Array<A> => Array<B> {
return (arr: Array<A>) => arr.map(f);
}
lift<A>(a: A): Array<A> { return [a]; }
join<A>(tta: Array<Array<A>>): Array<A> {
return tta.reduce((prev, cur) => prev.concat(cur));
}
}
åŒæ°ã§ãžã§ããªãã¯åã®åæãçŽæ¥èš±å¯ããããšã«å ããŠãtypedefã¯ãã®æ¹æ³ã§ãžã§ããªãã¯ã®å®çŸ©ããµããŒãããããšãææ¡ããŸãïŒåé¡308ãåç §ïŒã
typedef Maybe<Array<~>> Composite<~> ;
class Foo implements Monad<Composite<~>> { ... }
typedefãæå¹ã«ããã«ã¯ãå®çŸ©ãšãšã€ãªã¢ã¹ã®ã¢ãªãã£ãäžèŽããŠããå¿ èŠããããŸãã
æ¥ãã§ä»®å®ããããšã¯ãããŸããããééã£ãŠå ¥åããŠãããšæããŸãã ãã¹ãŠã®ãã©ã¡ãŒã¿ã¿ã€ãã«ã¯ãã©ã¡ãŒã¿åãå¿ èŠãªã®ã§ãããããå ¥åããã€ããã§ãã
map<A, B>(f: (x: A) => B): T<A> => T<B>;
äžæ¹ãçŸåšmapã¯ãã¿ã€ãany
ïŒãã©ã¡ãŒã¿ãŒåã¯A
ïŒããB
ããããŒãååŸããé¢æ°ã§ãã
ããè¯ãçµæãåŸãã«ã¯ã --noImplicitAny
ãã©ã°ã䜿çšããŠã¿ãŠãã ããã
ããããšããèšæ£ããŸããã
ã³ã¡ã³ããææ¡ã«æŽæ°ããŸããã
ïŒ+1ïŒããé«ãçš®é¡ã®åã¯ãé¢æ°åããã°ã©ãã³ã°æ§é ã«ãšã£ãŠå€§ããªããŒãã¹ã«ãªããŸããããã®åã«ãé«éé¢æ°ãšæ±çšïŒpãæ£ãããµããŒãããããšæããŸãã
æºæ¿èªæžã¿ã
ç§ãã¡ã¯ãã®ã¢ã€ãã¢ããšãŠãæ°ã«å ¥ã£ãŠããŸããããã¹ãŠã®åœ±é¿ãšæœåšçãªãšããžã±ãŒã¹ãç解ããããã«è©ŠããŠã¿ãã«ã¯ãå®çšçãªå®è£ ãå¿ èŠã§ãã å°ãªããšããã®80ïŒ ã®ãŠãŒã¹ã±ãŒã¹ã«åãçµããµã³ãã«PRããããšã次ã®ã¹ãããã§éåžžã«åœ¹ç«ã¡ãŸãã
ãã«ãæ§æã«é¢ãã人ã
ã®æèŠã¯äœã§ããïŒ T~2
ã®ä»£ããã«æ¬¡ã®ããã«ãªããŸã
interface Foo<T<~,~>> {
bar<A, B>(f: (a: A) => B): T<A, B>;
}
ããã«ãããåãšã€ãªã¢ã¹ãå¿ èŠãšããã«ãžã§ããªãã¯ãçŽæ¥æ§æã§ããŸãã
interface Foo<T<~,~,~>, U<~>, V<~, ~>> {
bar<A, B, C, D>(a: A, f: (b: B) => C, d: D): T<U<A>, V<B, C>, D>;
}
ä»ã®å Žæã§ã¯å®éã«ã¯ããããªãã®ã§ãæ瀺çãªã¢ãªãã£ãæã€ã®ã¯å¥åŠã§ãã
interface Foo<T<~,~>> {
bar<A, B>(f: (a: A) => B): T<A, B>;
}
ãã ããä»ã®èšèªã§ã¯ãåæ§ã®ã³ã³ããã¹ãã§~
代ããã«*
ã䜿çšãããŠããããšãããããŸãã
interface Foo<T<*,*>> {
bar<A, B>(f: (a: A) => B): T<A, B>;
}
ãã®ç¹ã極端ã«ãšãããŠãã次ã®ããšãããããããããŸããã
interface Foo<T: (*,*) => *> {
bar<A, B>(f: (a: A) => B): T<A, B>;
}
T<~,~>
ãT~2
ãããã¯ãªã¢ã ãšæããŸãã äžèšã®ææ¡ãå€æŽããŸãã ~
ãš*
ã©ã¡ãã䜿çšããŠãããŸããŸããã JSèå¥åã«ããããšã¯ã§ããªããããããšãã°_
䜿çšããããšã¯ã§ããŸããã =>
è¡šèšãã©ã®ãããªã¡ãªãããããããã®ãããããŸããã ãã¹ãŠã®ãžã§ããªãã¯ã¯ããã€ãã®å
¥åã¿ã€ããåããåäžã®åºåã¿ã€ããè¿ããŸãã
æ§æã軜éã«ãªããšããžã§ããªãã¯ã®ã¢ãªãã£ãå®å šã«å€±ãããŸãã ããŒãµãŒã¯æåã®äœ¿çšãããããç解ããæ®ãããããšäžèŽããªãã£ãå Žåã¯ãšã©ãŒãã¹ããŒããŸãã
ãã®æ©èœã®å®è£ äœæ¥ãéå§ã§ããã°å¹žãã§ãã ãã©ã³ã¹ãã€ã©ãŒã®å®è£ ã®è©³çŽ°ã«ã€ããŠéçºè ãæ©ãŸãããã®æšå¥šãã©ãŒã©ã ã¯äœã§ããïŒ
ããè€éãªã³ãŒããµã³ãã«ã䜿çšããŠããã倧ããªè³ªåã®å€ãã®æ°ããåé¡ããã°ã«èšé²ããããäžé£ã®è³ªåã䜿çšããŠé·æã«ãããåé¡ãäœæãããã§ããŸãã ãŸãã¯ã httpsïŒ//gitter.im/Microsoft/TypeScriptã®ãã£ããã«ãŒã ã«åå ããŠãããã§è©±ãããšãã§ããŸãã
@metawetaäœããã¥ãŒã¹ã¯ãããŸããïŒ ãã«ã/ãã£ã¹ã«ãã·ã§ã³ãå¿ èŠãªå Žåã¯ããã®åé¡ã«ã€ããŠãã¬ã€ã³ã¹ããŒãã³ã°ãè¡ã£ãŠããã ããã°å¹žãã§ãã ç§ã¯æ¬åœã«ãã®æ©èœã欲ããã§ãã
ããããä»äºäžã®ãã®ã¯ç§ãããã«åãçµãå¿ èŠããã£ãèªç±ãªæéãåŒãç¶ããŸããã
ãã³ãïŒãã®æ©èœããããŸã§ã«æ€èšãããã®ãèŠãæ©äŒã¯ãããŸããïŒ
https://github.com/Microsoft/TypeScript/issues/1213#issuecomment-96854288ã¯ãŸã çŸåšã®ç¶æ ã§ãã æ©èœã®åªå 床ãå€æŽãããããªãã®ã¯ããã«ã¯ãããŸããã
ããã¯ãåè«ã®æœè±¡åãã€ã³ããŒãããã ãã§ãªããã¯ããã«å€ãã®ç¶æ³ã§åœ¹ç«ã€ããã«æããŸãã ããšãã°ã Promise
å®è£
ïŒã³ã³ã¹ãã©ã¯ã¿ãŒïŒãåŒæ°ãšããŠåãã¢ãžã¥ãŒã«ãã¡ã¯ããªãèšè¿°ã§ãããšäŸ¿å©ã§ããããšãã°ããã©ã°ã€ã³å¯èœãªpromiseå®è£
ãåããããŒã¿ããŒã¹ã§ãã
interface Database<P<~> extends PromiseLike<~>> {
query<T>(s:string, args:any[]): P<T>
}
ããã§ãéå®ããŸãhttp://stackoverflow.com/questions/36900619/how-do-i-express-this-in-typescript
ïŒ+1ïŒ
HKTã®èãæ¹ãå€ããããšãã§ããç¿æ £ãå£ãã倱ãããäžä»£ãçãè¿ãããããšãã§ããŸãããžã§ããªãã¯ã¹ãšæ瀺çãªnullãšæªå®çŸ©ãªã®ã§ããã¹ãŠãå€ããããšãã§ããŸãã
ããã次ã®å€§ããªç¹åŸŽãšèããŠãã ãããããè¯ã銬ãæ±ãç¶ãã人ã ã«è³ãåŸããã®ããããŠã圌ãã«af * g ferrari
ã¯ããæ¢åã®JSã³ãŒãããŒã¹ã«åãè¿œå ããããšããåŸãæåã®15åéã¯ããã«ã¶ã€ãããŸããã ç§ã¯ãããèŠããŸã§TSã«åãæ¿ããŸããã
å®éã«æäŒã£ãŠããããŸããïŒ
ããã¯ïŒ7848ãšã©ã®ããã«é¢ä¿ããã®ã ãããïŒ ãããã¯éåžžã«äŒŒãŠããŸãããé«æ¬¡ã®çš®é¡ã®ä»ã®åŽé¢ã«ã€ããŠã§ãã
@ boris-marinov Ryan Cavanaughã®è¿ä¿¡ã«ãããšã次ã®ããšãã§ããŸãã
å°ãªããšããã®80ïŒ ã®ãŠãŒã¹ã±ãŒã¹ã«åãçµããµã³ãã«PRããããšã次ã®ã¹ãããã§éåžžã«åœ¹ç«ã¡ãŸãã
ä»ãç§ã¯ã³ã¢éçºè ããããã€ãã®ãã³ããåŸãããã«ãã®ãããªåçŽãªPRããŒããå®è£ ããæéããããŸããããããŸã§ã®ãšãã質åã¯ãããŸãã-ãã¹ãŠãè¯ããŠç解ã§ããããã«èŠããŸãã ããã§é²è¡ç¶æ³ã远跡ããŸãã
@Artazorã¯ã©ããã³ã°ïŒ7848ãèŠãŠã¿ãŸãããïŒ ããã«ããããžã§ããªãã¯ãå«ããã®åé¡ã®å察åŽãåŠçãããŸããIMHOã§ã¯ããžã§ããªãã¯ããªããšäžå®å šã«æããããŸãïŒãžã§ããªãã¯ãã©ã¡ãŒã¿ãŒã¯ãå€ãã®åã¬ãã«ã®ã³ãŒããå®éã«åçŽåããŸãïŒã
ãã®ææ¡ã¯çµ¶å¯Ÿã«çŽ æŽããããšæããŸãã TypeScriptã§ããé«ãçš®é¡ã®åã䜿çšãããšãçŸåšå¯èœãªãã®ããã匷åãªæœè±¡åãèšè¿°ã§ããæ°ããã¬ãã«ã«å°éããŸãã
ããããOPã®äŸã«äœãåé¡ã¯ãããŸãããïŒ è¡ã®A
class ArrayMonad<A> implements Monad<Array> {
ãããã¯ãã¹ãŠç¬èªã®æ±çšA
æã£ãŠãããããã©ã®ã¡ãœããã§ã䜿çšãããŸããã
ãŸãã this
ã䜿çšããã¡ãœãããšããŠmap
ã䜿çšããŠãã¡ã³ã¯ã¿ãŒãå®è£
ãããšãã©ã®ããã«ãªããŸããïŒ å€åãã®ããã«ïŒ
interface Functor<T, A> {
map<B>(f: (a: A) => B): T<A> => T<B>;
}
class Maybe<A> implements Functor<Maybe, A> {
...
}
@ paldepind ïŒ
ãã®ãããªãã®ã¯ãã€çéžããã®ã§ããïŒ ããã¯äžçš®ã®æ¬è³ªçãªããã§ãã
ãŸããããã¯ãã®ãããªããšãå¯èœã«ããã§ãããïŒ
interface SomeX<X, T> {
...// some complex definition
some: X<T>
}
interface SomeA<T> extends SomeX<A, T> {
}
ïŒ
@whitecolorçŸæç¹ã§ã¯ããã倧ããªéãæããããšãå€ããŸãã
bind
ã call
ãããã³apply
ã¯åæå®ãããŠããŸããã ããã¯å®éã«ã¯å¯å€ååŒæ°ãžã§ããªãã¯ã®ææ¡ã«äŸåããŸãã Object.assign
ãåæ§ã®ä¿®æ£ãå¿
èŠã§ãããå¯å€ååŒæ°ãžã§ããªãã¯ã ãã§ã¯ããã解決ã§ããŸããã_.pluck
ãBackboneã¢ãã«ã®get
ããã³set
ã¡ãœãããªã©ã®é¢æ°ã¯çŸåšåæå®ãããŠãããããããä¿®æ£ãããšãåºæ¬çã«BackboneãTypeScriptã§ã¯ããã«å®å
šãªæ¹æ³ã§äœ¿çšã§ããããã«ãªããŸãã ãŸããå°æ¥çã«Reactã«åœ±é¿ãäžããå¯èœæ§ããããŸãããã®æ©èœãå¿ èŠãªããšããããã§ã¯ãããŸããïŒãã®ãããªæ©èœã倧奜ãã§ãïŒããŸããªãç»å Žããå¯èœæ§ã¯äœããšæããŸãã
@isiahmeadows
説æããããšãããããŸãã ããããªã¹ãã®3çªç®ã®é
ç®ã¯éåžžã«éèŠã§ã httpsïŒ//github.com/Microsoft/TypeScript/issues/1295ãåŸ
ã£ãŠã
ããããç§ã¯çŸåšã®åé¡ããããã2.1devã§äœããã®åœ¢ã§çºçããããšãæãã§ããŸãã
åæããã ããŸãããã°ãããã¯ãããäœãããšãã§ããŸãã
ïŒãã®åé¡ãæãã§ããã©ã³ã¯2ã®å€åãå¿
èŠã§ã
Fantasy LandãŠãŒã¶ãŒã¯ããã®ä»æ§å
ã®ããŸããŸãªADTãé©åã«å
¥åããŸãã
ã©ã ãã¯ããããããªãã²ã©ãå¿
èŠãšããã©ã€ãã©ãªã®è¯ãäŸã§ããïŒ
ç«ã2016幎9æ6æ¥ã«ã¯ãåå11æã¢ã¬ãã¯ã¹[email protected]ã¯æžããŸããïŒ
@isiahmeadows https://github.com/isiahmeadows
説æããããšãããããŸãã ããããªã¹ãã®3çªç®ã®é ç®ã¯éåžžã«éèŠã§ãã
ïŒ1295ãåŸ ã£ãŠããŸãhttps://github.com/Microsoft/TypeScript/issues/1295
ããŸãã«ããããããç§ã¯çŸåšã®åé¡ããããã2.1devã§äœããã®åœ¢ã§çºçããããšãæãã§ããŸãã
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãããã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/Microsoft/TypeScript/issues/1213#issuecomment -244978475ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AERrBMvxBALBe0aaLOp03vEvEyokvxpyks5qnX_8gaJpZM4C99VY
ã
ãã®æ©èœã¯ãåå¿ãã©ãŒã ãå®çŸ©ããã®ã«å€§ãã«åœ¹ç«ã€ããã§ãã ããšãã°ã次ã®ãããªæ§é äœããããŸãã
interface Model {
field1: string,
field2: number,
field3?: Model
}
次ã®ããã«å®çŸ©ããããã³ãã©ãŒããããŸãã
interface Handler<T> {
readonly value: T;
onChange: (newValue: T) => void;
}
ãã®ãã³ãã©ãŒã¯ãå°éå ·ãšããŠReactã³ã³ããŒãã³ãã«æž¡ãããŸãã ãŸããæ§é äœãåããåãæ§é äœãè¿ãé¢æ°ããããŸãããå€ã®ä»£ããã«ãã³ãã©ãŒããããŸãã
function makeForm(value: Model): {
field1: Handler<string>,
field2: Handler<number>,
field3: Handler<Model>,
}
TSã¯ä»ã®åã®æ§é ã«åºã¥ããŠåãçæã§ããªããããä»ã®ãšããããã®é¢æ°ãæ£ããå ¥åããããšã¯ã§ããŸããã
çHKTã§makeForm
ãšå
¥åã§ããŸããïŒ
ããŒããé¢çœãã
ãã¶ãããã®ãããªããšãå¯èœãããããŸããïŒ
//Just a container
interface Id <A> {
value: A
}
interface Model <T> {
field1: T<string>,
field2: T<number>,
field3?: T<Model>
}
makeForm (Model<Id>): Model<Handler>
@ boris-marinovæãèå³æ·±ãç¹ã¯ã次ã®è¡ã§ãã
interface Model<T> {
//...
field3?: T<Model> // <- Model itself is generic.
// Normally typescript will error here, requiring generic type parameter.
}
HKTãããããéšååïŒhttps://github.com/Microsoft/TypeScript/issues/4889#issuecomment-247721155ïŒãžã®çãã§ãã£ãå¯èœæ§ãããããšãèšåãã䟡å€ããããããããŸããïŒ
type MyDataProto<K<~>> = {
one: K<number>;
another: K<string>;
yetAnother: K<boolean>;
}
type Identical<a> = a;
type Optional<a> = a?; // or should i say: a | undefined;
type GettableAndSettable<a> = { get(): a; set(value: a): void }
type MyData = MyDataProto<Identical>; // the basic type itself
type MyDataPartial = MyDataProto<Optional>; // "partial" type or whatever you call it
type MyDataProxy = MyDataProto<GettableAndSettable>; // a proxy type over MyData
// ... etc
å®å
šã§ã¯ãããŸããã {x: number?}
ã¯{x?: number}
ã«å²ãåœãŠãããšãã§ããŸããã
ååšããããšãä¿èšŒãããŠããŸãããä»ã¯ååšããŸããã
ç«ã2016幎10æ11æ¥ã«ã¯ãåå9æ16åã¢ã¬ã¯ã»ã€Bykovã®[email protected]ã¯æžããŸããïŒ
HKTãããããã«å¯Ÿããçãã§ãã£ãå¯èœæ§ãããããšãèšåãã䟡å€ããããããããŸãã
éšååïŒïŒ4889ïŒã³ã¡ã³ãïŒ
https://github.com/Microsoft/TypeScript/issues/4889#issuecomment-247721155
ïŒïŒ
MyDataProtoãšå
¥åããŸã
å¥ïŒK
ãŸã å¥ïŒK
} type Identical = a; typeãªãã·ã§ã³= aïŒ;
= {getïŒïŒïŒa;
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/Microsoft/TypeScript/issues/1213#issuecomment -252913109ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AERrBNFYFfiW01MT99xv7UE2skQ3qiPMks5qy4wRgaJpZM4C99VY
ã
@isiahmeadowsããªãã¯æ£ããã§ããçŸæç¹ã§ã¯ãããããã£ããã®ã¿ã€ãã®ã¿ã«åºã¥ããŠçã«ãªãã·ã§ã³ã«ããæ¹æ³/æ§æã¯ãããŸããããããŠããã¯æ®å¿µã§ã
ããã«ãã1ã€ïŒããããã£ãreadonly
ã§ãããšããã§ãããã ããçš®ã®ãã¯ãæ©èœãå¿
èŠãªããã§ãã
ãã ãããã«ãããæããŠ...ç§ã奜ã*
äžã®æ§æã~
æ§æã ãã«ã€ããŠã®äœãã¯ãããŒããŒãã¬ã€ã¢ãŠãã®èŠ³ç¹ããã¯ãããŸã§ã®ãšããéªéã«ãªããªãããã§ãã ãŸããçç±ã¯ããããŸãããã*ã¯ãããã¯ã¹ã«å«ãŸãããã¹ãŠã®ã¢ã³ã°ã«ãã©ã±ããã§å°ãèªã¿ããã/åºå¥ããããããã«æãããŸãã èšããŸã§ããªããHaskellã®ãããªä»ã®èšèªã«ç²ŸéããŠãã人ã¯ããã«æ§æãHKTã«é¢é£ä»ãããããããŸããã ããå°ãèªç¶ãªããã§ãã
*
æ§æã«åæããå¿
èŠããããŸãã ãŸããããã¯ããåºå¥å¯èœã§ãã
ãããŠç¬¬äºã«ãããã¯ãã©ããªã¿ã€ãã§ãæ©èœãããã¿ã€ããããããè¡šããŸãã
ã€ã·ã¢ã¡ããŠãº
[email protected]
0:10ã®æ¥ã2016幎11æ6æ¥ã«ã¯ãã©ã³ãã³POCH [email protected]
æžããŸããïŒ
ãããæšãŠãã ãã§ã...ç§ã¯ãæ§æããã*æ§æã®æ¹ã奜ãã§ãã
ãã«ã€ããŠã®äœãã¯ãããŒããŒãã¬ã€ã¢ãŠãããã¯çšé ãããã§ã
èŠç¹ã ãŸããçç±ã¯ããããŸãããã*ã¯ããå°ãå€ãããã§ã
ããã¯ã¹ã«å«ãŸãããã¹ãŠã®ã¢ã³ã°ã«ãã©ã±ããã§èªã¿åãå¯èœ/èå¥å¯èœã
èšããŸã§ããªããHaskellã®ãããªä»ã®èšèªã«ç²ŸéããŠãã人ã¯
æ§æãããã«HKTã«é¢é£ä»ããŸãã ããå°ãèªç¶ãªããã§ããâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/Microsoft/TypeScript/issues/1213#issuecomment -258659277ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AERrBHQ4SYeIiptB8lhxEAJGOYaxwCkiks5q7VMvgaJpZM4C99VY
ã
ãã€ã«ã¹ããŒã³ïŒ community
ïŒ ãã®åé¡/æ©èœã®çŸåšã®ç¶æ
ã¯äœã§ããïŒ
@whitecolorã¹ããŒã¿ã¹ã¯DIYã§ãïŒèªåã§ãã£ãŠãã ããïŒ
ãã®åé¡ã«ã¯Accepting PRs
ã©ãã«ãä»ããŠããŸãã ããã¯ããã®æ©èœãå®è£
ããããã®ãã«ãªã¯ãšã¹ããæè¿ãããããšãæå³ããŸãã 詳现ã«ã€ããŠã¯ã httpsïŒ//github.com/Microsoft/TypeScript/wiki/FAQ#what-do-the-labels-on-these-issues-meanãåç
§ããŠ
https://github.com/Microsoft/TypeScript/issues/1213#issuecomment-96854288ãåç §ããŠ
ããããŸãããã©ãã«ã衚瀺ãããŸãããTS以å€ã®ããŒã ããããéæã§ãããã©ããçåããããŸãã
ä»ãç§ã¯ã³ã¢éçºè ããããã€ãã®ãã³ããåŸãããã«ãã®ãããªåçŽãªPRããŒããå®è£ ããæéããããŸããããããŸã§ã®ãšãã質åã¯ãããŸãã-ãã¹ãŠãè¯ããŠç解ã§ããããã«èŠããŸãã ããã§é²è¡ç¶æ³ã远跡ããŸãã
@Artazorããã§éãããã§ããïŒ
@ raveclassic-æã£ãããé£ããããã«ãªããŸããããããã§ãåé²ããããšæã£ãŠããŸãã æ§æçã«ã¯æããã§ãããã¿ã€ããã§ãã¯ã®ã«ãŒã«/ãã§ãŒãºã¯ç§ãæãã»ã©æ確ã§ã¯ãããŸãã-ïŒ
ç§ã®æŽ»åã埩掻ãããŠã¿ãŸããã-ïŒ
é²æç¶æ³ãšã¢ã€ãã¢éçºã®ãã¹ã远跡ããã ãã§ãã ãã®æ©èœãå®è£ ããæ¹æ³ã3ã€ã®ãªãã·ã§ã³ã§æ€èšããŸããã
ãªãã·ã§ã³ã®higherShape
ããããã£ã§TypeParameterDeclaration
ã匷åããããšãèšç»ããŸãã
export interface TypeParameterDeclaration extends Declaration {
kind: SyntaxKind.TypeParameter;
name: Identifier;
higherShape?: HigherShape // For Higher-Kinded Types <--- this one
constraint?: TypeNode;
// For error recovery purposes.
expression?: Expression;
}
HigherShape
ã©ã®ããã«å®è£
ã§ããã3ã€ã®ãªãã·ã§ã³ãæ€èšããŸãã
type HigherShape = number
次ã®äœ¿çšæ³ã«å¯Ÿå¿ããŸãã
class Demo<Wrap<*>, WrapTwo<*,*>> { // 1 and 2
str: Wrap<string>;
num: Wrap<number>;
both: WrapTwo<number, string>;
}
ãã®æãåçŽãªã±ãŒã¹ã§ã¯ã number
ã¿ã€ãã§ååã§ããããã«èŠããŸãã ããã§ããç¹å®ã®åœ¢ç¶èŠä»¶ã®ååŒæ°ãšããŠäœ¿çšã§ããããšã確èªããããã«ãç¹å®ã®åããšã«å®éã®higherShapeã決å®ã§ããå¿
èŠããããŸãã ãããŠãããã§åé¡ã«çŽé¢ããŠããŸãã Demo
ã¯ã©ã¹èªäœã®ããé«ã圢ç¶ã¯ãæ°å€ãšããŠè¡šçŸã§ããŸããã ãããããªããããã¯2
ãšããŠè¡šãããã¹ãã§ã-2ã€ã®ã¿ã€ããã©ã¡ãŒã¿ãããã®ã§ã
ãããŠæžãããšã¯å¯èœã ãã
var x: Demo<Array, Demo>
次ã«ãããããã£.both
ããé
延åãã§ãã¯ã®åé¡ãšæŠããŸãã ãããã£ãŠã number
ã¿ã€ãã§ã¯äžååã§ãïŒç§ã¯ä¿¡ããŠããŸãïŒã
å®éãã¿ã€ãDemo
ã¯ã次ã®é«æ¬¡ã®åœ¢ç¶ãããŠããŸãã
(* => *, (*,*) => *) => *
次ã«ãåè¿°ã®ãããªåœ¢ç¶ãè¡šçŸã§ãããããã«æªãããšã«ãããé«ã圢ç¶ã®å察ã®æãå®å šãªè¡šçŸã調æ»ããŸããã
(* => (*,*)) => ((*,*) => *)
ãã®ããã®ããŒã¿æ§é ã¯åçŽã§ãããTypeScriptåã·ã¹ãã ãšã¯ããŸãçžäºäœçšããŸããã ãã®ãããªé«æ¬¡ã®åãèš±å¯ããå Žåã *
ãå€ã®å
¥åã«äœ¿çšã§ããã°ã©ãŠã³ãåãæå³ãããã©ããã¯ããããŸããã ãã®äžãç§ã¯ãã®ãããªå·šå€§ãªé«éå¶çŽãã©ã®ããã«è¡šçŸãããã«ã€ããŠé©åãªæ§æãèŠã€ããããšããã§ããŸããã§ããã
äž»ãªã¢ã€ãã¢-ååŒïŒå®éã®ååŒæ°ãããå Žåã§ãïŒã¯åžžã«ã°ã©ãŠã³ãåã«ãªããŸã-ããã¯å€æ°ã®åä»ãã«äœ¿çšã§ããŸãã äžæ¹ãååãã©ã¡ãŒã¿ãŒã¯ãä»ã®å Žæã§äœ¿çšãããŠããã®ãšåã圢åŒã§ãç¬èªã®è©³çŽ°ãªåãã©ã¡ãŒã¿ãŒãæã€ããšãã§ããŸãã
ããã¯ç§ãæå±ããããšããç§ã®æçµæ±ºå®ã§ããã
type HigherShape = NodeArray<TypeParameterDeclaration>;
äŸïŒ
class A {x: number}
class A2 extends A { y: number }
class Z<T> { z: T; }
class SomeClass<T1<M extends A> extends Z<M>, T2<*,*<*>>, T3<* extends string>> {
var a: T1<A2>; // checked early
var b: T2<string, T1>; // second argument of T2 should be generic with one type parameter
var c: T3<"A"|"B">; // not very clever but it is checked
// ...
test() {
this.a.z.y = 123 // OK
// nothing meaningful can be done with this.b and this.c
}
}
ããã§ã M
ã¯T1<M extends A> extends Z<M>
ã«å¯ŸããŠããŒã«ã«ã§ãããT1ãããæ·±ãå¯èŠæ§ã¹ã³ãŒãã«ååšããããšã«æ³šæããŠãã ããã ãããã£ãŠã M
ã¯SomeClass
æ¬äœã§ã¯äœ¿çšã§ããŸããã
ãŸãã *
ã¯ãäœãšãè¡çªããªãïŒåŸã®æ®µéã§å®è£
ã§ããïŒåçŽãªæ°ããèå¥åïŒå¿ååïŒãæå³ããŸãã
ãããã£ãŠãTypeParameterDeclarationã®æçµçãªçœ²å
export interface TypeParameterDeclaration extends Declaration {
kind: SyntaxKind.TypeParameter;
name: Identifier;
typeParameters?: NodeArray<TypeParameterDeclaration> // !!!
constraint?: TypeNode;
// For error recovery purposes.
expression?: Expression;
}
ïŒ - @DanielRosenwasserã@ã¢ã¬ã¯ã»ã€ã»bykovã@isiahmeadowsåã³ãã®ä»ã®ä»»æã®æèŠãèãããã§ã
ç§ã«ã¯åé¡ãªãããã«èãããŸãããTypeScriptã®ã³ãŒãããŒã¹ã®å éšæ§é ã«ã€ããŠã¯ã»ãšãã©ç¥ããŸããã
ãããèŠæ±ããåå±å£ã«ç§ã®å£°ãå ããŠãããªããå¿æŽããããšæããŸããArtazorïŒ :)
ãã®æ©èœã¯ãReduxãã¿ââã€ãã»ãŒãã«ããå®è£ ã§åœ¹ç«ã¡ãŸãã
@michaeltontchev Reduxãã¿ââã€ãã»ãŒãã«ããããã«ã©ã®ãããªåé¡ããããŸããïŒ
èå³ã®ããæ¹ã®ããã«ãæè¿https://github.com/bcherny/tduxãšhttps://github.com/bcherny/typed-rx-emitterãå ¬éããŸããããããã¯ãReduxãšEventEmitterã®ã¢ã€ãã¢ã«åºã¥ããŠããŸãã
ããã§ãããã©ã«ãã®ãžã§ããªãã¯ãã©ã¡ãŒã¿ã䜿çšããŠ@rbucktonãã©ã³ãïŒ13487ã«ãªããŒã¹ããå¿ èŠããããŸãã ãã以å€ã®å Žåãç§ãã¡ã¯å€§ãã察ç«ããŸãã
@ bcherny-ãªã³ã¯ãããããšããç§ã¯ãããããã§ãã¯ããŸãïŒ
ç§ã¯ãå·ã®ãã¹ãŠã®ããããã£ã«é©åãªã¿ã€ãã®ã¬ãã¥ãŒãµãŒãããããšã確èªããããšã«ãã£ãŠãcombineReducersãã¿ã€ãã»ãŒãã«ããæ¹æ³ãæ€èšããŠããŸããïŒäœåãªãã®ã¯ãããŸããïŒã ãã®ç¹å®ã®ã±ãŒã¹ã§ã¯ããã¹ãããããžã§ããªãã¯ãªãã§ãããè¡ãããšãã§ããŸãããããã¹ãããããœãªã¥ãŒã·ã§ã³ã®æ¹ãåªããŠããã§ãããã ç§ã¯æ¬¡ã®ãã®ãæã£ãŠããŸãïŒ
import { combineReducers, Reducer } from 'redux';
interface IState {
// my global state definition
}
type StatePropertyNameAndTypeAwareReducer\<S> = {
[P in keyof S]: Reducer<S[P]>;
};
let statePropertyToReducerMap : StatePropertyNameAndTypeAwareReducer<IState> = {
navBarSelection: navBarReducer,
};
let combinedReducers = combineReducers<IState>(statePropertyToReducerMap);
åºæ¬çã«ãäžèšã§çŽ¹ä»ããã¿ã€ãã¯ãcombineReducersã«æž¡ãã¬ãã¥ãŒãµãŒãããã³ã°ãç¶æ ã®ãã¹ãŠã®ããããã£ãã«ããŒããé©åãªæ»ãå€ã®åãæã€ããšãä¿èšŒããŸãã ãªã³ã©ã€ã³ã§æ€çŽ¢ããŠãããšãã«ãã®ãããªè§£æ±ºçãèŠã€ããããšãã§ããŸããã§ãã-ãã£ã2ãæåã«ãªãªãŒã¹ãããkeyofæ©èœãªãã§ã¯ãããè¡ãããšãã§ããªãããã§ã:)
keyofæ©èœã¯ãã»ãã¿ãŒãšã²ãã¿ãŒãã¿ã€ãã»ãŒãã«ããããã«ImmutableJã«ã圹ç«ã€ãšæããŸããããããåé¿ããããã®è¿œå ã®ããŒã«ãå¿ èŠã«ãªãå ŽåããããŸãã
ç·šéïŒæ確ã«ããããã«ããã¹ãããããžã§ããªãã¯ã¯ãStatePropertyNameAndTypeAwareReduceråã«ReduceråãããŒãã³ãŒãã£ã³ã°ããå¿ èŠã¯ãªãã代ããã«ãžã§ããªãã¯ãšããŠæž¡ãå¿ èŠããããŸããããã¹ãããããžã§ããªãã¯ã§ããå¿ èŠããããŸããããã¯ãã§ã¯äžå¯èœã§ããç¬éã
Edit2ïŒããã§Reduxã®åé¡ãäœæããŸããïŒ https ïŒ
é¢é£ïŒ https ïŒ
調åã¯ã©ãã§ããïŒ
åçŽãªè³ªåãããããŸãããããªãéåžžã®æ±çšãã©ã¡ãŒã¿ãŒã®ä»£ããã«~
ãŸãã¯*
ãªã®ã§ããïŒ æªäœ¿çšã§ããããšã瀺ããŠããã®ã§ããïŒ ã€ãŸãã äœæ
ãªã®ïŒ
type Functor<A<T>> = {
map(f: (value: T) => U): A<U>
}
ãŸãã¯ïŒ
kind Functor<A<T>> = {
map(f: (value: T) => U): A<U>
}
ãããã¯ïŒ
abstract type Functor<A<T>> = {
map(f: (value: T) => U): A<U>
}
@bcherny Functor<A<T>>
ã¯ã以åã¯ã A
ã®T
A
ããæå³ããŠãããããããã«ããæ§æããããŸãã«ãªããšæããŸããããã§ã T
ã¯ããŒã«ã«ã®ã¿ã€ãã§ããç¯å²ã å¯èœæ§ã¯äœãã§ãããåãçç±ã§ããã®æ§æãäžéšã®ã³ãŒãããŒã¹ã®é倧ãªå€æŽã«ãªãå¯èœæ§ããããŸãã
@masaeeduãªãã»ã©ã æ°ããæ§æã¯ããçŸåšã®ã¹ã³ãŒãã§T
å³å¯ã«ãã€ã³ããããã§ã¯ãªããã T
é
延ãã€ã³ããããããšãæå³ããŸãã
ããã¯èšã£ãŠãã @ DanielRosenwasserã®T: * => *
ã®ææ¡ã¯ããå
è¡æè¡ãããããããããã§æãçã«ããªã£ãŠãããšæããŸãã
Haskellã§ã¯ãæŒç®å->
ã¯å®éã«ã¯ãã©ã¡ãŒã¿ãŒåãããåã§ãïŒããããFunc<TArg, TRet>
ãèŠèŠåããæ¹ãç°¡åã§ãïŒã åã³ã³ã¹ãã©ã¯ã¿ãŒ->
ã¯ã2ã€ã®ä»»æã®åT
ãšU
ãåãå
¥ããåT
å€ããããããå€ã³ã³ã¹ãã©ã¯ã¿ãŒïŒã€ãŸãé¢æ°ïŒã®åãçæããŸããã¿ã€ãU
ã
èå³æ·±ãã®ã¯ãããã芪åãªã³ã³ã¹ãã©ã¯ã¿ãŒã§ããããšããããšã§ãïŒ çš®é¡ã³ã³ã¹ãã©ã¯ã¿ãŒ->
ã¯ã2ã€ã®ä»»æã®çš®é¡T*
ãšU*
ïŒèŠèŠçãªåºå¥ã®ããã®ã¢ã¹ã¿ãªã¹ã¯ïŒãåãå
¥ããçš®é¡T*
åããããããçš®é¡ã®åã³ã³ã¹ãã©ã¯ã¿ãŒãçæããŸãã U*
ã
ãã®æç¹ã§ãã¿ãŒã³ã«æ°ä»ããããããŸããã åã®å®çŸ©ãšåç
§ã«äœ¿çšãããŠããæ§æãšã»ãã³ãã£ã¯ã¹ã¯ãçš®é¡ã®å®çŸ©ãšåç
§ã«åå©çšãããŠããã ãã§ãã å®éãããã¯åå©çšãããããŠãããã2ã€ã®ç°ãªãå®å®ã§åæã«ç©äºãæé»çã«å®çŸ©ããŠããã ãã§ãã ïŒå®éã«ã¯ååã§ãããšããäºå®ã¯ãäžå¹žãª*
ãé€ããŠããããç¡éã®ã¬ãã«ãå€->ã¿ã€ã->çš®é¡->ãœãŒã-> ...ã§ç©äºãå®çŸ©ã§ããããšãæå³ããŸãããããã¯å¥ã®æéã®ãããã¯ïŒ
å®éããã®ãã¿ãŒã³ã¯éåžžã«çã«ããªã£ãŠããããã ->
ã ãã§ãªãããã¹ãŠã®åã³ã³ã¹ãã©ã¯ã¿ãŒã«äžè¬åãããåºã䜿çšãããŠããGHCiæ¡åŒµæ©èœãå®è£
ãã人ãããŸãã æ¡åŒµæ©èœã¯ãããŒã¿ã®çš®é¡ããšåŒã°ããHaskellãç°çš®ãªã¹ãïŒ []
ã¯å€ã®ãªã¹ãã®ã¿ã€ãã§ãããã¿ã€ãã®ãªã¹ãã®çš®é¡ã§ãããïŒãç°çš®ã¿ãã«ããã¹ããŒãã¬ã³ã°ã¹ãã«ãã£ãŠããããããæ¹æ³ã§ãã "ãã¯ãã«ãããã³ä»ã®å€ãã®æ©èœã
ããããããŸã DataKinds
ãŸã§è¡ããããªãã®ã§ã芪åãªã³ã³ã¹ãã©ã¯ã¿ãŒ*
ãš->
ã«åºå·ããŸãããDanielã®ææ¡ããæ§æã«åŸãå ŽåããŸãã¯ããäžè¬çã«ã¯ãçš®é¡ã®å®çŸ©ãåã®å®çŸ©ãšååã«ããå Žåããã®é åã§ã®å°æ¥ã®éçºãå©çšããããã«èªåèªèº«ãéããŸãã
以åã®ãšããšãã®ãªãæçš¿ã«ç¶ããŠã any
代ããã«*
any
ã䜿çšããããšããå§ãããŸãã ããã¯ããã¹ãŠã®å€ã®ã¿ã€ããšãã¹ãŠã®ã¿ã€ãã®çš®é¡ã®äž¡æ¹ãè¡šããŸãã æ§æããããã«ããå Žåã¯ãHaskellã®æ¬ããããŒãžãåãåºãã '
ãã¬ãã£ãã¯ã¹ã䜿çšããŠçš®é¡ãšã¿ã€ããæ確ã«ããããšãã§ããŸãã
OPã®äŸã¯æ¬¡ã®ããã«èšè¿°ãããŸãã
interface Monad<(T: 'any => 'any)> {
// ...
}
NitpickïŒ any
ã¯ã2ã€ã®ç°ãªãããšãè¡ããšããæå³ã§ãäžè¬çã«æ··ä¹±ããŠãããšæããŸãã
ããã¯ä»ã®ãã¹ãŠã®ã¹ãŒããŒã¿ã€ãã§ãããä»ã®ãã¹ãŠã®ãµãã¿ã€ãã§ã¯ãªããããé¢æ°ãany
ãã©ã¡ãŒã¿ãŒãèŠæ±ããå Žåã¯ãäœã§ãå
¥åã§ããŸãã ãããŸã§ã¯é 調ã§ããã
é¢çœããªãã®ã¯ãé¢æ°ãç¹å®ã®äœããèŠæ±ãã any
ãæäŸãããšãã§ãã ãã®ã¿ã€ããã§ãã¯ã¯ãèŠæ±ããããã®ãããåºãä»ã®ãã¹ãŠã®ã¿ã€ãã代ããã«ãšã©ãŒã«ãªããŸãã
ãããããããäœã§ãã
å¥ã®æ³šæç¹ãšããŠã '
ã¯æååãªãã©ã«ã§ã䜿çšããããããæ··ä¹±ãæããŸãã
@Artazorããã«é¢ãããã¥ãŒã¹ã¯ãããŸããïŒ ååã話ãããããã«ãããã©ã«ãã®ãžã§ããªãã¯ãã©ã¡ãŒã¿ã«åºã¥ããŠãªããŒã¹ããå¿ èŠããããŸãã ãããŠãäœæ¥äžã®POCã«ååè¿ãã®ã¯ããªãã ãã ãšç§ã«ã¯æããŸãã
ããããµãã¿ã€ãã³ã°ãšã©ã®ããã«çžäºäœçšãããã«ã€ããŠãèãã䟡å€ããããŸãã *
ãåç¬ã§äœ¿çšããã ãã§ã¯äžååã§ãã æçããªã¢ãŒãã£ãºã ã®ä»£ããã«ã¢ãããã¯ããªã¢ãŒãã£ãºã ã䜿çšããèšèªã§ã¯ãåãå
¥ãå¯èœãªååŒæ°ãå¶éããããã®å¶çŽã®çš®é¡ããããŸãã äŸãšããŠã Monad T
ã®çš®é¡ã¯å®éã«ã¯Constraint
ã§ã¯ãªã*
ã§ãã
TypeScriptã§ã¯ã代ããã«æ§é ãµãã¿ã€ãã䜿çšãããããçš®é¡ã¯ã¿ã€ãéã®ãµãã¿ã€ãé¢ä¿ãåæ ããå¿ èŠããããŸãã ãã®äž»é¡ã«é¢ããScalaã®è«æã¯ã芪åãªã·ã¹ãã ã§åæ£ãšãµãã¿ã€ãã®é¢ä¿ãè¡šçŸããæ¹æ³ã«ã€ããŠããã€ãã®è¯ãã¢ã€ãã¢ãçã¿åºããããããŸããïŒãããé«ãçš®é¡ã®ã¿ã€ãã®å¹³çãªæš©å©ã«åããŠãã
ããã«ã€ããŠäœãé²å±ã¯ãããŸããïŒ
@gcantiã«ãã代æ¿ã¢ãããŒãhttps://medium.com/@gcanti/higher-kinded-types-in-typescript-static-and-fantasy-land-d41c361d0dbe
fp-tsãæ¡çšããã¢ãããŒãã®åé¡ã¯ãä»ã®æ¹æ³ã§èšŒæãããã©ã€ãã©ãªãåå®è£ ããããšã§ãã ç§ã«ãšã£ãŠãtypescriptã®èãæ¹ã¯ãJavaScriptã§çŸåšãã¹ããã©ã¯ãã£ã¹ãšèããããŠãããã®ãæ£ããå ¥åã§ããããã«ããããšã§ãããtsã®æ¹æ³ã§åå®è£ ããããšã匷å¶ããããšã§ã¯ãããŸããã
ããã«ã¯ããã¡ã³ã¿ãžãŒã©ã³ããã©ã ãããŸãã¯åå¿ãã©ãŒã ã®ããããã§ãçŸåšjsã©ã€ãã©ãªã§äœ¿çšããŠããã³ã³ãã©ã¯ããæ£ããèšè¿°ããããã«HKTãå¿ èŠã§ããããšã瀺ãäŸããããããããŸãã
ããã匷å¶ãããŠããã®ãèŠãã®ã¯æ¬åœã«çŽ æŽãããã§ããã:)
ããã®ææã§åãããšãããšããªã/ã§ãã人ã¯ããŸããïŒ ããŠãæ°è»œã«ç§ã«é£çµ¡ããŠè°è«ããŸãã ãŸãã¯ã誰ããããã«åãçµãããã«èŠã€ãããããããªã誰ããæå°ããããšãã§ããŸããç§ã«ãç¥ãããŠãã ãããã [ç·šéïŒç§ã¯[ãããã決å®ãã]ïŒhttps://github.com/keean/zenscript/issues/35#issuecomment -357567767ïŒãã®ãšã³ã·ã¹ãã ãæŸæ£ãããã®ã¹ã¬ããã§ã®ãã®åŸã®ã³ã¡ã³ãã«ããããããã倧èŠæš¡ãªäœæ¥ã«ãªãã ãããšæ°ã¥ããŸãã]
@gcantiã«ãã代æ¿ã¢ãããŒãhttps://medium.com/@gcanti/higher-kinded-types-in-typescript-static-and-fantasy-land-d41c361d0dbe
çµæã®map
ããŸã Option
ã³ã³ããã¿ã€ããæ瀺çã«æå®ããŠããã®ã§ããããå®å
šã«ç解ããå¿
èŠã¯ãããŸããã§ããããããã£ãŠãããé«çš®é¡ã®ã¿ã€ãïŒHKTïŒã®ããã«å®å
šã«ãžã§ããªãã¯ã§ã¯ãããŸãããæäŸããããšãã§ããïŒ
function map<A, B>(f: (a: A) => B, fa: HKTOption<A>): Option<B> {
return (fa as Option<A>).map(f)
}
@spionã2016幎8æ26æ¥ã«è¿°ã¹ãããã«ãHKTã¯ããã¡ã¯ããªãå¿ èŠãšããåãã©ã¡ãŒã¿åãããã³ã³ããåèªäœãæ±çšã§ããé¢æ°ãæ±çšã«ããããã«å¿ èŠã§ãã ããã°ã©ãã³ã°èšèªã®èšèšã«ã€ããŠã®è°è«ã§ããã
PSèå³ãããã°ããã®æ©èœã¯ããã°ã©ãã³ã°èšèªã©ã³ãã¹ã±ãŒãã®ç§ã®ïŒ @keeanãå«ãïŒåæã«å€§ãã圱é¿ããŸãã
@ shellby3 FWIW Option
's map
ïŒ Option.ts
ïŒã¯ã€ã³ã¹ã¿ã³ã¹ãè¡šãã Functor
' s map
ïŒ Functor.ts
ïŒã¯ãåã¯ã©ã¹ãè¡šãããããžã§ããªãã¯ã§ãã 次ã«ãä»»æã®ãã¡ã³ã¯ã¿ãŒã€ã³ã¹ã¿ã³ã¹ã§åäœã§ããæ±çšã®lift
é¢æ°ãå®çŸ©ã§ããŸãã
ããã匷å¶ãããŠããã®ãèŠãã®ã¯æ¬åœã«çŽ æŽãããã§ããã:)
ç§ã¯åŒ·ãåæããŸã:)
@ shellby3 ïŒãã®ãããªæ©èœãããŒãžããã«ã¯ãæåã®çã¯æ¬¡ã®ããã«ããããšã§ãã
TSããŒããããã§åªå
é äœãä»ããã ç§ã¯äž»ã«åŸãããã€ãã®PRãæã£ãŠããŸãã
å°ããªä¿®æ£ããã£ãå ŽåããŸãã¯ãã§ã«æ¢ããŠããå Žåã®ãã£ãŒãããã¯/ããŒãž
ãããã«ã ç§ã¯åŠå®çã«ãªããããªãããããªãããããªãããã¯èæ
®äºé
ã§ã
ããã«ãªãœãŒã¹ãæè³ããããšããŠããŸãã
2018幎1æ8æ¥16:05ããshelby3ã [email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
ãã®ææã§åãããšãããšããªã/ã§ãã人ã¯ããŸããïŒ ãæ°è»œã«ãåãåãããã ãã
ç§ã¯[email protected]ã§è©±ãåããŸãã ãŸãã¯èª°ã§ã誰ããæå°ããããšãã§ããŸã
ããã«åãçµãããšãã§ãããããããŸããããç§ã«ãç¥ãããŠãã ããã@gcantiã«ãã代æ¿ã¢ãããŒãhttps://github.com/gcanti
https://medium.com/@gcanti/higher -kinded-types-in-
typescript-static-and-fantasy-land-d41c361d0dbeçµæã®ãããã芳å¯ããã®ã§ãç§ã¯ãããå®å šã«ç解ããããšãæ°ã«ããŸããã§ãã
ãŸã ãªãã·ã§ã³ã³ã³ããã¿ã€ããæ瀺çã«æå®ããŠãããããå®å šã§ã¯ãããŸãã
é«çš®é¡ã¿ã€ãïŒHKTïŒãæäŸã§ããäžè¬çãªæ¹æ³ïŒé¢æ°ãããïŒfïŒïŒaïŒAïŒ=> BãfaïŒHKTOption ïŒïŒãªãã·ã§ã³{ returnïŒfa as Option ïŒ.mapïŒfïŒ }
HKTã¯ããã¡ã¯ããªãšãå¿ èŠãšããé¢æ°ãæ±çšåããããã«å¿ èŠã§ãã
ã¿ã€ããã©ã¡ãŒã¿åãããã³ã³ããã¿ã€ãã¯ãããèªäœãæ±çšã§ããå¿ èŠããããŸãã æã ã¯æã£ãŠãã
ãã®https://github.com/keean/zenscript/issues/10ãç§ãã¡ã®
ããã°ã©ãã³ã°èšèªã®èšèšã«ã€ããŠã®è°è«ãPSèå³ãããã°ããã®æ©èœã¯ç§ã®
ïŒ @keean https://github.com/keean'sãå«ãïŒã®åæ
ããã°ã©ãã³ã°èšèªã®é¢šæ¯
https://github.com/keean/zenscript/issues/35#issuecomment-355850515 ã ç§
ç§ãã¡ã®èŠè§£ãTypescriptã®åªå é äœãšå®å šã«çžé¢ããŠããããã§ã¯ãªãããšãç解ããŠãã ãã
Javascript / ECMAScriptãšãµããŒãã®ã¹ãŒããŒã»ããã«ãªãããšãäž»ãªç®æšãšããŠããŸã
ãã®ãšã³ã·ã¹ãã ãâ
ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/Microsoft/TypeScript/issues/1213#issuecomment-355990644 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AC6uxYOZ0a8G86rUjxvDaO5qIWiq55-Fks5tIi7GgaJpZM4C99VY
ã
@gcanitiã¯ãã€ãºã«ã€ããŠãè©«ã³ããè¿œå ã®èª¬æãããããšãããããŸãã ã³ã¡ã³ãããåã«ãã£ãšå匷ãã¹ãã ã£ãã ãã¡ãããïŒç§ã¯ãã§ã«ç¥ã£ãŠããïŒãã¡ã³ã¯ã¿ãŒã¯ã€ã³ã¹ã¿ã³ã¹ã®å®è£ ãå¿ èŠãšããã®ã§ãããã¯æŠå¿µåã«ãããç§ã®èª€ãã§ãã
Afaicsãããªãã®å·§åŠãªãããã¯ãã¯ããã¡ã¯ããªãäžè¬çã«åç
§ããããšãå¯èœã«ããŸãïŒããšãã°ã lift
ïŒãããã¡ã³ã¯ã¿ã®ç¹æ®ãªã¿ã€ãã®äžè¬çãªãã¡ã¯ããªã®åã¿ã€ãã³ã°ãïŒæŽæ°ããã³ïŒç¹æ®åããããã®ã¢ãžã¥ãŒã«æ¡åŒµã®è¿œå ã®å®åæãå¿
èŠã§ãäŸïŒ Option
ã ãã®å®åæã¯ããžã§ããªãã¯ãã¡ã¯ããªã®ãã¹ãŠã®ãžã§ããªãã¯äœ¿çšã«å¿
èŠã§ã¯ãªãã§ãããããããšãã°ããžã§ããªãã¯sort
äŸ@keeanãšç§ã¯è©±ãåããŸããã ãããããä»ã®ã³ãŒããŒã±ãŒã¹ãçºèŠãããå¯èœæ§ããããŸããïŒ
Kotlinã¯ããªãã®ã¢ã€ãã¢ãã³ããŒããŸããã
ç§ã¯åŠå®çã«ãªããããããŸããããããã«ãªãœãŒã¹ãæè³ããããšããŠããã®ã§ããã°ãããã¯èæ ®äºé ã§ãã
ããããã®èãã¯ç§ã«ãèµ·ãããŸããã ãããæ確ã«ããŠãããŠããããšãã @masaeeduãææããŠããããã«ãèæ ®äºé ã®1ã€ã¯ãåã·ã¹ãã ãžã®äžè¬çãªåœ±é¿ãšãåã·ã¹ãã ãçæããå¯èœæ§ã®ããã³ãŒããŒã±ãŒã¹ã§ãããšæãããŸãã ãããéåžžã«åŸ¹åºçã«èããããå®èšŒãããªãéããããããæµæãããã§ãããã
ãŸããEMCAScriptã³ã³ãã€ã«ã¿ãŒã²ãããžã®æè³ã®ã¬ãã«ãããæ£ç¢ºã«ç¢ºèªããããã«ãCeylonã調ã¹ãŠããããšã«æ³šæããŠãã ããã ïŒãã£ãšå匷ããå¿ èŠããããŸãïŒã
ç§ããã®å¶éã«åãŸããã°ããã§ãã 次ã®äŸã®I
ãèªåçã«æšæž¬ããããšæããŸãã
interface IdType<T> {
id: T;
}
interface User {
id: number;
name: string;
}
function doStuff<T extends IdType<I>>() {
const recs = new Map<I, T>();
return {
upsert(rec: T) {
recs.set(rec.id, rec);
},
find(id: I) {
return recs.get(id);
},
};
}
(function () {
const stuff = doStuff<User>();
stuff.upsert({id: 2, name: "greg"});
console.log(stuff.find(2));
})();
ç§ã®ç¥ãéããããã«ã¯ããçš®é¡ã®å€ãåãå¿
èŠã§ããããåé·ãšæãããéè€ãããžã§ããªãã¯ãã©ã¡ãŒã¿ãŒïŒ doStuff<User, number>()
ïŒãæå®ããå¿
èŠããããŸãã
ç§ã¯æè¿ããã®å¶éã«ãæãããŸããã
ç§ã¯çŽæã®ããã«å³æžé€šã«åãçµãã§ããŸããã ããããæäœããããã®ããŸããŸãªãŠãŒãã£ãªãã£é¢æ°ãæäŸããŸãã
ã©ã€ãã©ãªã®äžå¿çãªæ©èœã¯ãã©ã€ãã©ãªå ã«çœ®ããã®ãšåãã¿ã€ãã®promiseãè¿ãããšã§ãã ãããã£ãŠãBluebird promiseã䜿çšããŠããŠãé¢æ°ã®1ã€ãåŒã³åºããšãBluebirdpromiseãšããããæäŸãããã¹ãŠã®è¿œå æ©èœãè¿ãããŸãã
ç§ã¯ãåã·ã¹ãã ã§ããããšã³ã³ãŒããããã£ãããç§ã¯ããã«ã¿ã€ãã§ã®äœæ¥ããããå¿
èŠã§ããããšãå®çŸP
çš®é¡ã®* -> *
ããã«P<T> extends Promise<T>
ã
ãã®ãããªé¢æ°ã®äŸã次ã«ç€ºããŸãã
/**
* Returns a promise that waits for `this` to finish for an amount of time depending on the type of `deadline`.
* If `this` does not finish on time, `onTimeout` will be called. The returned promise will then behave like the promise returned by `onTimeout`.
* If `onTimeout` is not provided, the returned promise will reject with an Error.
*
* Note that any code already waiting on `this` to finish will still be waiting. The timeout only affects the returned promise.
* <strong i="14">@param</strong> deadline If a number, the time to wait in milliseconds. If a date, the date to wait for.
* <strong i="15">@param</strong> {() => Promise<*>} onTimeout Called to produce an alternative promise once `this` expires. Can be an async function.
*/
timeout(deadline : number | Date, onTimeout ?: () => PromiseLike<T>) : this;
äžèšã®ç¶æ³ã§ã¯ãããªãããããŒãªthis
ã¿ã€ãã䜿çšããããšã§ãããé«ãçš®é¡ã®å¿
èŠæ§ãåé¿ããããšãã§ããŸããã
ãã ãã次ã®å Žåã¯è§£æ±ºã§ããŸããã
/**
* Returns a promise that will await `this` and all the promises in `others` to resolve and yield their results in an array.
* If a promise rejects, the returned promise will rejection with the reason of the first rejection.
* <strong i="21">@param</strong> {Promise<*>} others The other promises that must be resolved with this one.
* <strong i="22">@returns</strong> {Promise<*[]>} The return type is meant to be `Self<T[]>`, where `Self` is the promise type.
*/
and(...others : PromiseLike<T>[]) : ExtendedPromise<T[]>;
this<T[]>
ãäœããããããšãå¯èœã«ããããã¯ããªãããã§ãã
ããã¥ã¡ã³ãã®ç§ã®å°ããªè¬çœªã«æ³šæããŠãã ããã
äžèšã®åèæç®ã«ç€ºãããŠããããã«ããã®æ©èœã圹ç«ã€ãšç§ãä¿¡ããå¥ã®ã·ããªãªãæã«å ¥ããŸããïŒç§ãææ¡ãæ£ãã解éãããšä»®å®ããŠïŒã
åé¡ã®ããã±ãŒãžã§ã¯ããžã§ããªãã¯åã¯éåžžãŠãŒã¶ãŒãäœæãããããåãšããŠäœ¿çšãããåãªãã®ãžã§ããªãã¯ã¯ã©ã¹ãŸãã¯é¢æ°ãå¿ èŠã§ãã
ç§ã®ã·ããªãªã«ææ¡ãé©çšãããšã次ã®ããã«ãªããšæããŸãã
import { Component, FunctionalComponent } from 'preact';
interface IAsyncRouteProps {
component?: Component<~,~> | FunctionalComponent<~>;
getComponent?: (
this: AsyncRoute,
url: string,
callback: (component: Component<~,~> | FunctionalComponent<~>) => void,
props: any
) => Promise<any> | void;
loading?: () => JSX.Element;
}
export default class AsyncRoute extends Component<IAsyncRouteProps, {}> {
public render(): JSX.Element | null;
}
ç§ã®å®è£ ã§ã¯ãžã§ããªãã¯åã確å®ã«åç §ããæ¹æ³ããªãããšãèãããšãç§ã¯äœããèŠéããŠãããšç¢ºä¿¡ããŠããŸãã
@ Silic0nS0ldierå®éããã®ã±ãŒã¹ã¯ä»ãã解決ã§ããŸãã 次ã®ãããªæ§é ã³ã³ã¹ãã©ã¯ã¿ã¿ã€ãã䜿çšããŸãã
type ComponentConstructor = {
new<A, B>() : Component<A, B>;
}
ãããŠã component ?: ComponentConstructor
ãšèšããŸãã
ããã«äžè¬çã«ã¯ãå®éã«ã¯ãžã§ããªãã¯é¢æ°åãæã€ããšãã§ããŸãã
let f : <T>(x : T) => T
ããã¯ã©ã³ã¯nãã©ã¡ãŒã¿ãŒå€çžãšåŒã°ããå®éã«ã¯èšèªã§ã¯éåžžã«ãŸããªæ©èœã§ãã ãããã£ãŠãTypeScriptã«ãã¯ããã«äžè¬çãªæ©èœã§ãããããçš®é¡ã®å€ãåããªãçç±ã«ã€ããŠã¯ãããã«äžå¯è§£ã§ãã
ããã§èª¬æããå¶éã¯ãç¹å®ã®TComponent<T, S>
ãåç
§ããå¿
èŠãããå Žåã«è¡šç€ºãããŸãã ããããããªãã®å Žåãããã¯äžèŠã®ããã§ãã
typeof Component
ã䜿çšããŠãã³ã³ã¹ãã©ã¯ã¿ãŒComponent
ã®åãååŸããããšãã§ããŸãããããã«ããããµãã¿ã€ãã§ããŸããŸãªåé¡ãçºçããŸãã
@GregRosææ¡ããããœãªã¥ãŒã·ã§ã³ã¯ææã«èŠããŸãããïŒå®çŸ©ãã¡ã€ã«å ã®åãåãå ¥ããŸãïŒãäºææ§ã®ããåã¯æåŠãããŠããŸãã https://gist.github.com/Silic0nS0ldier/3c379367b5e6b1abd76e4a41d1be8217
@ Silic0nS0ldierèŠç¹ã«ã€ããŠã®ç§ã®ã³ã¡ã³ããåç §ããŠãã ããã
@chrisdaviesããã¯æ©èœããŸããïŒ
interface IdType<T> {
id: T;
}
interface User {
id: number;
name: string;
}
function doStuff<T extends IdType<any>>() {
type I = T['id']; // <==== Infer I
const recs = new Map<I, T>();
return {
upsert(rec: T) {
recs.set(rec.id, rec);
},
find(id: I) {
return recs.get(id);
},
};
}
(function() {
const stuff = doStuff<User>();
stuff.upsert({ id: 2, name: "greg" });
console.log(stuff.find(2));
})();
@ jack-ãŠã£ãªã¢ã ãºããã ããã¯ç§ã®ã·ããªãªã§ã¯ããŸããããŸãã ç§ã¯ããã¥ã¡ã³ãã§ãã®äŸãèŠã€ããŠããŸããã§ããïŒç§ã¯ç©äºãæ¬ ããŠããããšã§ç¥ãããŠããŸããïŒïŒã ããããšãããããŸããïŒ
ç§ã¯ãã®æ©èœã«ã€ããŠããèããŠãããããçš®ã®ä»æ§ã«åŸåããŠãã®åé¡ã«ã€ããŠããã€ãèããŠããŸãããããã§ãå€ãã®åé¡ãèŠãããšãã§ããŸãã ç§ã®ææ¡ã¯ããããŸã§ã«ææ¡ããããã®ãšã¯å°ãç°ãªããŸãã
ãŸã第äžã«ãåã³ã³ã¹ãã©ã¯ã¿ãŒã«T<*, *>
æ§æã䜿çšããããšã¯ãåã³ã³ã¹ãã©ã¯ã¿ãŒã®è€éãã«ããŸã察å¿ã§ããªããããæªãèãã ãšæããŸãã ãŸããåãã©ã¡ãŒã¿ãŒãæã€é¢æ°ã§ãã£ãŠããé¢æ°ã«å¯ŸããŠãããè¡ããªããããåç
§ããããã³ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã®çš®é¡ãæå®ããããšã«æå³ããããã©ãããããããŸããã
ãããå®è£ ããæè¯ã®æ¹æ³ã¯ãä»ã®åãšåãããã«éåžžã®ååã§ããçš®é¡ã®å€ãåãæ±ããå¶çŽã課ãããã«äœ¿çšã§ããåã³ã³ã¹ãã©ã¯ã¿ãŒèªäœã«å¯ŸããŠé©åãªãµãåé¢ä¿ãå®çŸ©ããããšã ãšæããŸãã
ããçš®ã®æ¥é èŸãŸãã¯æ¥å°ŸèŸã䜿çšããŠãä»ã®åãšåºå¥ããå¿
èŠããããšæããŸããäž»ã«ãéåžžã®ã³ãŒããèšè¿°ãããã ãã®å Žåã«ãåã³ã³ã¹ãã©ã¯ã¿ãŒã«é¢é£ããç解ã§ããªããšã©ãŒã¡ãã»ãŒãžãããŠãŒã¶ãŒãä¿è·ããããã§ãã ~Type, ^Type, &Type
ãªã©ã®å€èŠ³ã奜ãã§ãã
ãããã£ãŠãããšãã°ãé¢æ°ã®ã·ã°ããã£ã¯æ¬¡ã®ããã«ãªããŸãã
interface List<T> {
push(x : T);
}
function mapList<~L extends ~List, A, B>(list : L<A>, f : (x : A) => B) : L<B>;
ïŒç§ã¯æå³çã«æ§ç¯ãããåã«~
ãã¬ãã£ãã¯ã¹ã䜿çšããŠããŸããïŒ
ããã§extends
ã䜿çšããããšã«ãããåºæ¬çã«2ã€ã®ããšãèšããŸããã
** 1ã å¿
èŠãªå ŽåïŒ ~L
ã¯ã ~List
ãšåãçš®é¡ã®åã³ã³ã¹ãã©ã¯ã¿ãŒã§ããã€ãŸããçš®é¡* -> *
ïŒãŸãã¯ã =>
ãªã®ã§* => *
ïŒã§ãã =>
ã¯TypeScriptã®ç¢å°ã§ãïŒã
~L
ã¯~List
ãµãã¿ã€ãã§ãã**extends
ã䜿çšããŠåã³ã³ã¹ãã©ã¯ã¿ãŒã®çš®é¡ã瀺ããšã ((* => *) => (* => *)) => *
ãªã©ã®ä»»æã®è€éãªåã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¹ã±ãŒãªã³ã°ãããŸãã
ã¿ã€ãã®èå¥åã§ãã®çš®é¡ãå®éã«èŠãããšã¯ã§ããŸããããç§ã¯ããªããããããå¿ èŠã¯ãªããšæããŸãã åã³ã³ã¹ãã©ã¯ã¿ãŒéã®ãµãã¿ã€ãé¢ä¿ãåãä¿æããå¿ èŠããããã©ããããããããªãã®ã§ãïŒ1ïŒã¯å¿ èŠãªããããããŸããã
äžå®å šãªåã®æ§ç¯ããµããŒããã¹ãã§ã¯ãªããšæããŸãã ã€ãŸãã次ã®ãããªãã®ã§ãã
(*, *) => * => *
ããã¯äŸ¡å€ããããããå€ãã®åé¡ãåŒãèµ·ãããšæããŸãã ã€ãŸãããã¹ãŠã®åã³ã³ã¹ãã©ã¯ã¿ãŒã¯äœããã®å ·è±¡åãäœæããå¿ èŠãããããã®å ·è±¡åã¯TCãå®çŸ©ãããŠããã³ã³ããã¹ãã§æå®ããå¿ èŠããããŸãã
ãŸããéåžžã«é«æ¬¡ã®ãžã§ããªãã¯é¢æ°åãå«ããä»ã®åãæ§é çã«æå®ã§ããã®ãšåãããã«ãåã³ã³ã¹ãã©ã¯ã¿ãŒãæå®ããæ§é çãªæ¹æ³ãããã¹ãã ãšæããŸãã ç§ã¯æ¬¡ã®ãããªæ§æãèããŠããŸããïŒ
~<A, B> {
a : A,
b : B
}
ããã¯ãåãã©ã¡ãŒã¿ãŒãæã€é¢æ°åã®æ¢åã®æ§æã«äŒŒãŠããŸãã
<A, B>() => { a : A, b : B};
ãã®2ã€ãçµã¿åãããŠãããååŸããããšãã§ããŸãã
~<A><B, C> => [A, B, C]
ããã¯ããžã§ããªãã¯é¢æ°åãæ§ç¯ããåã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã
å©ç¹ã¯ããããã®æ§é åãä»ã®æ§é åãæå®ãããšããåå¶çŽãæå®ãããšããªã©ã«äœ¿çšã§ããããšã§ãã ããã¯ãä»ã®å Žæããã¯åç §ã§ããªãåç §ããŒã«ã«ã·ã³ãã«ã䜿çšã§ããããšãæå³ããå ŽåããããŸãã
次ã«äŸã瀺ããŸãã
type List<A, B> = ...;
type AdvancedType<~L extends ~<A>List<A, B>, B> = ...;
äžèšã®äŸã§ã¯ãæ§é åã³ã³ã¹ãã©ã¯ã¿ãŒ~<A>List<A, B>
ã¯åãã©ã¡ãŒã¿ãŒB
åç
§ããŠããŸãã å°ãªããšãéšåçã«æ§ç¯ãããã¿ã€ãList<A, *>
ããšã³ã³ãŒãããªãéãããã®é¢ä¿ãä»ã®æ¹æ³ã§æå®ããããšã¯ã§ããŸããã ä»ã®äŸããããŸãã
ãµãã¿ã€ãã®é¢ä¿ã¯çã«ããªã£ãŠããããã§ããããããç¹åŸŽã¥ããã®ã«å€ãã®å°é£ã«ééããŸããã
ç§ã®æåã®ã¢ã€ãã¢ã¯æ¬¡ã®ãšããã§ããã ~A
ã~B
ãµãã¿ã€ãã«ãªãå ŽåïŒ
- ïŒaïŒãããã¯åãçš®é¡ã§ãªããã°ãªããŸããïŒå¶çŽã§ã¯ãªããã¢ãªãã£ã®èŠ³ç¹ããïŒã
- ïŒbïŒ
~A
ãã¹ãŠã®æ£åœãªãã©ã¡ãŒã¿ãŒåTâ, Tâ, ...
ã«ã€ããŠãA<Tâ, Tâ, ...>
ã¯B<Tâ, Tâ, ...>
ãµãã¿ã€ãã§ãªããã°ãªããŸããã
ãã ããããã«ã¯ããã€ãã®å¶éããããŸãã
ã¯ã©ã¹MySpecialPromiseã¯PromiseLike {}ãå®è£
ããŸã
ã¯ã©ã¹MyArrayPromise ãã®å Žåãããµãã¿ã€ãã®é¢ä¿ã¯ä¿åãããŸããã
ïŒbïŒã®ããäžè¬åãããããŒãžã§ã³ã¯æ¬¡ã®ãšããã§ãã
ïŒbïŒ
~A
ãã¹ãŠã®æ£åœãªãã©ã¡ãŒã¿ãŒåTâ, Tâ, ...
ã«å¯ŸããŠãA<Tâ, Tâ, ...>
ãã®ãµãã¿ã€ãã§ãããããª~B
ãã©ã¡ãŒã¿ãŒåSâ, Sâ, ...
ãååšããŸããB<Sâ, Sâ, ...>
ãèšãæããã°ãäžèšã®ç¹æ§ãåãããããã³ã°F ïŒT1ãT2ã...ïŒ= S1ãS2ã...ããããŸãã ãã®ãããã³ã°ã¯ããã©ã¡ãŒã¿æ§ç¯ããããã«äœ¿çšããå¿ èŠããããŸã
B<...>
ãã©ã¡ãŒã¿åããA<...>
ã åã³ã³ã¹ãã©ã¯ã¿ãŒã®çš®é¡ãç°ãªã£ãŠããŠãããããå®è¡ã§ããå ŽåããããŸãã
ãã®é¢ä¿ã®åé¡ã¯ãæ£ãããããã³ã°ãèŠã€ããæ¹æ³ãããããªãããšã§ãã èšåçåä»ãã®ããèšèªã§ã¯ã次ã®è¡ã«æ²¿ã£ããã¹ãŠã®ã¹ããŒãã¡ã³ãïŒ
A<...> extends B<...>
~A
ã®åãã©ã¡ãŒã¿ãŒãš~B
ã®åãã©ã¡ãŒã¿ãŒã®éã®ãããã³ã°ãå®çŸ©ããŸããããã«ããããããã³ã°ã埩å
ã§ããŸãã ãã ããTypeScriptã®æ§é åä»ãã®ã·ã¹ãã ã§ã¯ããã®åã®æ瀺çãªã¹ããŒãã¡ã³ãã«äŸåããããšã¯ã§ããŸããã
1ã€ã®æ¹æ³ã¯ã implements
å¥ããScalaã«äŒŒãããçš®ã®æœè±¡åã¡ã³ããŒãªã©ãé©åãªåæ
å ±ãæã€åã®åã³ã³ã¹ãã©ã¯ã¿ãŒã®ã¿ããµããŒãããããšã§ãã ãããããããåé²ããæ¹æ³ãã©ããã¯ããããŸããã
@ GregRos-èå³æ·±ãã¡ã¢ïŒ ããã€ãã®è³ªåã
å
·äœçãªã¿ã€ããšã¯ã©ãããæå³ã§ããïŒ çš®é¡ã*
äœãããŸãã¯ãã€ã³ããããåãã©ã¡ãŒã¿ãŒã®ãªãåãæå³ããŸããïŒ
äžå®å šãªåã®æ§ç¯ã¯ãããŸãã
äžå®å šãªåã®æ§ç¯ããµããŒããã¹ãã§ã¯ãªããšæããŸãã ã€ãŸãã次ã®ãããªãã®ã§ãã
ïŒ*ã*ïŒ=> * => *
äžå®å
šãªåãäœæãããšã¯ã©ãããæå³ã§ããïŒ L<A>
ãããªãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã¯çš®é¡*
ãæã€å¿
èŠããããšããããšã§ããã ããšãã°ããã¢ã®çš®é¡ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ããªãã®äŸã§ã¯ç¹å¥ã§ããïŒ (* => *) => * => *
ã¯å€§äžå€«ã§ããïŒ
åã³ã³ã¹ãã©ã¯ã¿ãŒãå®çŸ©ããæ§é çãªæ¹æ³
~<A, B> {
a : A,
b : B
}
inferface TyCon<A, B> {
a : A,
b : B
}
ãããã®äŸã¯ãæåã®äŸãå¿åã§ããããšãé€ããŠãç°ãªããŸããïŒ
ãµãã¿ã€ãã®é¢ä¿
~A
ãš~B
ã¯åãåç
§ããŠããªãã®ã§ããµãåã®é¢ä¿ãæã€ããšã¯çã«ããªã£ãŠããŸããïŒ ããã³ã³ã¹ãã©ã¯ã¿ãŒãå¥ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã®ããµãã¿ã€ããã§ããããšãå®éã«ç¢ºèªããå¿
èŠãããã®ã¯ãã€ã§ããã ã³ã³ã¹ãã©ã¯ã¿ãŒãé©çšããããŸã§åŸ
ã£ãŠãçµæã®åã確èªããããšã¯å¯èœã§ããïŒ
@ jack-williamsãã£ãŒãããã¯ãããããšãïŒ
äžå®å šãªåãäœæãããšã¯ã©ãããæå³ã§ããïŒ
L<A>
ãããªãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã«çš®é¡*ãå¿ èŠã ãšããããšã§ããã ããšãã°ããã¢ã®çš®é¡ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ããªãã®äŸã§ã¯ç¹å¥ã§ããïŒ(* => *) => * => *
ã¯å€§äžå€«ã§ããïŒ
ã¯ããæ£ç¢ºã«ã L<A>
ãããªãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãçš®é¡*
ã§ãã ãã®äžã§ã©ãã ã売ãããããããŸããã
ãããã®äŸã¯ãæåã®äŸãå¿åã§ããããšãé€ããŠãç°ãªããŸããïŒ
1ã€ç®ã¯ååŒã§ã2ã€ç®ã¯å®£èšã§ãã ãããã®ã¿ã€ããã»ãšãã©ã®ç¹ã§åäžã§ããã®ãšåãããã«ããããã¯ã»ãšãã©ã®ç¹ã§åäžã§ãã
{
a : number;
b : string;
}
interface Blah {
a : number;
b : string;
}
æ§æã«ã¯ããã€ãã®åæ©ããããŸãã
~A
ãš~B
ã¯åãåç §ããŠããªãã®ã§ããµãåã®é¢ä¿ãæã€ããšã¯çã«ããªã£ãŠããŸããïŒ ããã³ã³ã¹ãã©ã¯ã¿ãŒãå¥ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã®ããµãã¿ã€ããã§ããããšãå®éã«ç¢ºèªããå¿ èŠãããã®ã¯ãã€ã§ããã ã³ã³ã¹ãã©ã¯ã¿ãŒãé©çšããããŸã§åŸ ã£ãŠãçµæã®åã確èªããããšã¯å¯èœã§ããïŒ
åã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãåãšèŠãªãããå ŽåãšèŠãªãããªãå ŽåããããŸãã ç§ã¯ããããåãšèŠãªãããšãææ¡ããŸããå€ããªããå€ã®åãå¿ èŠãšããã³ã³ããã¹ãã«è¡šç€ºã§ããªãäžå®å šãªãã®ã§ãã ããã¯ããã®ããã¥ã¡ã³ãã§Scalaãæ¡çšããå²åŠãšåãã§ãã
ãµãã¿ã€ãé¢ä¿ãšã¯ãæ¬è³ªçã«ãåã³ã³ã¹ãã©ã¯ã¿ãŒãå¶çŽããããã«äœ¿çšã§ããããçš®ã®ãé©åãé¢ä¿ãæå³ããŸãã ããšãã°ã Promise<T>
ã Bluebird<T>
ãããŸããŸãªã¿ã€ãã®ããããçš®é¡ã®promiseã§æ©èœããé¢æ°ãäœæããå Žåã¯ãTCãã©ã¡ãŒã¿ãŒãå¶çŽããæ©èœãå¿
èŠã§ããäœããã®æ¹æ³ã§PromiseLike<T>
ãã€ã³ã¿ãŒãã§ãŒã¹ããŸãã
ãã®ã¿ã€ãã®é¢ä¿ã®èªç¶ãªèšèã¯ããµãã¿ã€ãã®é¢ä¿ã§ãã
äŸãèŠãŠã¿ãŸãããã åã³ã³ã¹ãã©ã¯ã¿ãŒéã®ãµãã¿ã€ãé¢ä¿ãäœæãããšä»®å®ãããšã次ã®ãããªé¢æ°ãèšè¿°ã§ããŸãã
function mapPromise<~P extends ~PromiseLike, A, B>(promise : P<A>, func : (x : A) => B) : P<B>;
ãããŠãå¶çŽ~P extends ~PromiseLike
ã¯ããããpromiseã§æ©èœããpromiseã®ã¿ã§æ©èœããé¢æ°ã§ããããšãä¿èšŒããããšã«ãªã£ãŠããŸãã ãã®å¶çŽã¯ãé¢æ°ã®æ¬äœå
ã§ã promise
ãPromiseLike<A>
ãªã©ãå®è£
ããããšãããã£ãŠããããšãä¿èšŒããŸãã ãã¹ãŠã®åŸã«ãé¢æ°ã®æ¬äœã«æŽ»åäœã«ãã£ãŠèªèã¡ã³ããŒãæ£ç¢ºã«å¶çŽãéããŠååšããããšã蚌æã§ãããã®ã§ãã
åæ§ã«ã Promise<T> extends PromiseLike<T>
ã¯æ§é çã«äºææ§ããããçžäºã«çœ®ãæããããšãã§ããããã ~Promise extends ~PromiseLike
æ§é çã«äºææ§ã®ããåãæ§ç¯ãããããçžäºã«çœ®ãæããããšãã§ããŸãã
ãµãã¿ã€ãã®åé¡ã®åé¡ã匷調ããããã«ãããäžåºŠæ€èšããŠãã ããã
interface MyPromise<T> extends Promise<T[]> {}
~Promise
æœè±¡åããã®ãšåãæ¹æ³ã§ã ~MyPromise
ã§æœè±¡åã§ããŸããïŒ ãããã®éã®é¢ä¿ãã©ã®ããã«æããŸããïŒ
ç§ã¯ä»¥åã®è©±ãããã³ã°ã¯ãã®ãã©ã¡ãŒã¿äžãããããã®ãããã³ã°ã§ãã~MyPromise
ã®ãã©ã¡ãŒã¿çæãããŸãã ~Promise
ã«ãã£ãŠæ§ç¯åã®ããã«~MyPromise
ã®ãµãã¿ã€ãã§ãããŸã~Promise
ã«ãã£ãŠæ§ç¯ããããã®ã
ãã®å Žåããããã³ã°ã¯æ¬¡ã®ããã«ãªããŸãã
T => T[]
@GregRos
ãã®å Žåã
~MySpecialPromise
ã¯çš®é¡ãç°ãªãããã~PromiseLike
ãµãã¿ã€ãã§ã¯ãããŸããã
Haskellã§ã¯ããã®çš®ã®åé¡ã¯ãåã®éšåé©çšãèš±å¯ããæçµçãªåãã©ã¡ãŒã¿ãŒãå®è£ ããŠããã€ã³ã¿ãŒãã§ã€ã¹ã®åãã©ã¡ãŒã¿ãŒãšäžèŽããããã«åãå®çŸ©ããããšã§è§£æ±ºãããŸãã
ããªãã®äŸã§ã¯ã MySpecialPromise
ã¯MySpecialPromise<TSpecial, TPromiseVal>
ãšããŠå®çŸ©ããã ~MySpecialPromise<SpecialType>
ã¯~Promise
ãšåãçš®é¡ã«ãªããŸãã
@GregRos
ãµãã¿ã€ãé¢ä¿ãšã¯ãæ¬è³ªçã«ãåã³ã³ã¹ãã©ã¯ã¿ãŒãå¶çŽããããã«äœ¿çšã§ããããçš®ã®ãé©åãé¢ä¿ãæå³ããŸãã ããšãã°ãPromiseã®ããã«ãããŸããŸãªã¿ã€ãã®ããããçš®é¡ã®Promiseã§æ©èœããé¢æ°ãèšè¿°ãããå Žå
ã éãé³¥ ãªã©ãã€ã³ã¿ãŒãã§ã€ã¹PromiseLikeã䜿çšããŠTCãã©ã¡ãŒã¿ãå¶çŽããæ©èœãå¿ èŠã§ãã äœããã®æ¹æ³ã§ã
function mapPromise<~P extends ~PromiseLike, A, B>(promise : P<A>, func : (x : A) => B) : P<B>
;
ãã®é¢æ°ã®åãã§ãã¯ã«é¢ããŠã¯ãéžæããT
ã«å¯ŸããŠBlueBird<T>
ãšPromiseLike<T>
ãçµ±åããããšãããšæããŸããããããã¯åãªãå
·äœçãªåã§ããããµãã¿ã€ãã«åé¡ãããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒ~BlueBird
ãš~PromiseLike
ç¹å¥ãªé¢ä¿ãå¿
èŠãªçç±ãããããŸããã
ãããªæãã§äœ¿ããããšæããŸããïŒ
let x: <P extends ~PromiseLike>(input : P<A>, func : (x : A) => B) : P<B>;
let y: <P extends ~BlueBird>(input : P<A>, func : (x : A) => B) : P<B>;
x = y;
ããã§ãyã®å¶çŽãxã®å¶çŽãæå³ããããšã確èªãããå ŽåããããŸãããTypeScriptã«ã¯ã BlueBird<T>
ã䜿çšå¯èœãªPromiseLike<T>
ãæ¡åŒµããããšã確èªããæ©æ§ããŸã ãããŸãããïŒ
@ jack-williams次ã®å¶çŽãã©ã®ããã«æå®ãããã«ãã£ãŠæ±ºãŸããŸãã
ãPã¯ããã¹ãŠã®
A
ãP<A>
ãPromiseLike<A>
ãµãã¿ã€ãã§ãããããªåã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã
ã©ã®ãããªæ§æã䜿çšããŸããïŒ ã©ããªã³ã³ã»ããã䜿ããŸããïŒ ããªãã¯ãã®ãããªãã®ãæžãããšãã§ããŸãïŒ
function mapPromise<~P, A, B where P<A> extends PromiseLike<A>>
ãã ãããã®æ§æã«ã¯å¶éããããŸãã ããšãã°ããã®ã¯ã©ã¹ãå¶çŽããããã«å®£èšãããæç¹ã§ã¿ã€ãP<A>
ãæ§ç¯ã§ããªãããããã®ã¯ã©ã¹ããŸã£ããè¡šçŸã§ããŸããã
class PromiseCreator<~P extends ~PromiseLike> {
create<A>() : P<A>;
}
ãããã次ã®ããã«ããã®ããã«å®ååã䜿çšã§ãããšæããŸãã
//Here A is not a captured type parameter
//It's an existential type we introduce to constrain ~P
class PromiseCreator<~P with some A where P<A> extends PromiseLike<A>> {
create<A>() : P<A>;
}
次ã«ããªãã·ã§ã³ã§ååšåã䜿çšããŠãé¢æ°ãŸãã¯åã®ã·ã°ããã£å ã§æ§ç¯ãããåãä»ããŠãã¹ãŠã®åã³ã³ã¹ãã©ã¯ã¿ãŒãå¶çŽããããã«èŠæ±ã§ããŸãã
å®ååã®å Žåãããã¯ãããã³ã°ãšã®ãµãã¿ã€ãé¢ä¿ãšåãè¡šçŸåãæã¡ãŸãã
ãã ããããã«ã¯è€æ°ã®åé¡ããããŸãã
((* => *) => *) => *
ãªã©ã®çš®é¡ã§åã³ã³ã¹ãã©ã¯ã¿ãŒãæå®ããã«ã¯ãå€ãã®å®ååãå°å
¥ããå¿
èŠãããããã®ãã¡ã®ããã€ãã¯é«éã§ãªããã°ãªããŸããã ãããã®ãã¹ãŠã¯ãé¢æ°ãŸãã¯ã¯ã©ã¹ã®ã·ã°ããã£ã«åºçŸããå¿
èŠããããŸãã@GregRos
ã©ã®ãããªæ§æã䜿çšããŸããïŒ ã©ããªã³ã³ã»ããã䜿ããŸããïŒ
_å人çã«_ç§ã¯ç¹å¥ãªæ§æã䜿çšããã次ã䜿çšããŸãã
function mapPromise<P extends PromiseLike, A, B>(p: P<A>, f: (x: A) => B): P<B>
class PromiseCreator<P extends PromiseLike> {
create<A>() : P<A>;
}
ããããããã¯number
ãããªãã®ãnull-aryã³ã³ã¹ãã©ã¯ã¿ãŒãšèŠãªããŠããã®ã§ãç§ã®æèŠã§ãããããã£ãŠãåºå¥ããå¿
èŠã¯ãããŸããã
ã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ã®ãµãã¿ã€ãã«é¢ããç§ã®èŠè§£ã¯ãå¯èœãªéãåçŽã«ä¿ã€ããšã§ãã ãããã¯åãã¢ãªãã£ãæã¡ããã©ã¡ãŒã¿ã¯ãScalaã®è«æã®ããã«ãåå€æ§ãšå ±åæ£ãèæ ®ã«å ¥ããŠãäºãã«ãµãã«ã€ã³ãã§ããå¿ èŠããããŸãã
éšåé©çšã¯ãããããç°ãªãã¢ãªãã£ãæã£ãŠããå Žåãåé¿ããããšãã§ããŸãïŒåã³ã³ã¹ãã©ã¯ã¿ãŒã®èªåã«ãªãŒåã¯æ°ã«ããªãã®ã§ã MySpecialPromise<SpecialType>
æžãã ãã§ãïŒã
interface MyPromise<T> extends Promise<T[]> {}
ã®äŸã§ã¯ãæ£çŽã«èšããšããã®ã±ãŒã¹ãåŠçããã®ã«è€éãã®äŸ¡å€ããããšã¯ç¢ºä¿¡ããŠããŸãããããããªããŠãååã«åœ¹ç«ã€æ©èœã ãšæããŸãã
ãã®å Žåã®åŠçââã¯ïŒç§ãæãã«ïŒæ¬¡ã®ããã«èšãã®ãšåãã§ãïŒ ~MyPromise extends ~(Promise . [])
ããã§ã []
ã¯ãªã¹ãã³ã³ã¹ãã©ã¯ã¿ãŒã§ã .
ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒæ§æã§ãã ã³ã³ã¹ãã©ã¯ã¿ãŒã®æ§é ã調ã¹ãã ãã§ã¯äžååãªãããç¶æ³ã¯ããã«é£ãããªã£ãŠããããã§ãããæ§æã«ã€ããŠãæšè«ããå¿
èŠããããŸãã
@ jack-williamsããã¯ããã©ã«ãã®åãã©ã¡ãŒã¿ã§ã¯æ©èœããŸããã P extends Foo
ãšæžããšã Foo
ã«ã¯ããã©ã«ãã®åãã©ã¡ãŒã¿ãŒãã€ãŸãtype Foo<T = {}> = ...
ããããŸããã P
çš®é¡ã¯äœã§ããïŒ
ç§ã¯é«æ¬¡ã®åãæ¿èªããŠãããšèšãããã ãã§ãïŒå®éã®TypeScriptãããžã§ã¯ãã§ã¯ããããã圹ç«ã€ç¶æ³ããããŸããïŒã
ããããã«ãªãŒåããµããŒãããã¹ãã§ã¯ãªããšæããŸãã ç§ã¯Haskellã倧奜ãã§ãããããã¯TypeScriptã«ã¯é©åããŸããã
é«æ¬¡ã®åã¯ãã«ãªãŒåãéšåé©çšããªããŠã䟿å©ã§ãããéšåé©çšãå¿ èŠãª
Foo<number, _> // equivalent to `type Foo1<A> = Foo<number, A>`
@ cameron-martin
ç·šéïŒç³ãèš³ãããŸããããç§ã®ã³ã¡ã³ãã¯ããŸãæ確ã§ã¯ãªãã£ããšæããŸãã P
ã¯ç¬èªã®çš®é¡ããããŸããã€ãŸãã䜿çšã«ãã£ãŠçš®é¡ã課ããããŸãã Sayå¶çŽã¯åžžã«æé«ã®çš®é¡ã§ãããšæ³å®ãããããã Foo
ã¯~Foo
ãšæ³å®ãããŸãã P
ã匷å¶çã«äžäœã®çš®é¡ã«ããå Žåã«ã®ã¿ã Foo
ã«ããã©ã«ããã©ã¡ãŒã¿ããããã©ããã確èªããŸãã ããã«é¢ããç§ã®æžå¿µã¯èŠªåãªæšè«ã§ããããã®å Žåã ~
圹ã«ç«ãããå®å
šãªæ³šéãå¿
èŠã ãšæããŸãã
P
ã¯ç¬èªã®çš®é¡ããããŸããïŒ è³ªåã¯ãç§ãã¡ãæ²»çãè¡ãããšã¯ãªãã§ãããFoo
ã®ããã«~Foo
ããŸãã¯ãšããŠFoo<{}>
ïŒç§ã¯ããã¯P.ã ãããäžçš®ã®ã«ãã£ãŠé§åããã䞻匵ããã ããããP
ã¯ããã©ã«ãã®ãã©ã¡ãŒã¿ãŒã匷å¶ããåã§ããã P
ãã³ã³ã¹ãã©ã¯ã¿ãŒ* => *
å Žåã Foo
ãåãããã«æ±ããŸãã
@Pauanããªãã®ææ¡ã«åæããŸãã
@ jack-williamså ã«è¿°ã¹ãããã«ããµãã¿ã€ãã®æŠå¿µãæ€èšããŸããã
ç§ã®æåã®ã¢ã€ãã¢ã¯æ¬¡ã®ãšããã§ããã
~A
ã~B
ãµãã¿ã€ãã«ãªãå ŽåïŒ
- ïŒaïŒãããã¯åãçš®é¡ã§ãªããã°ãªããŸããïŒå¶çŽã§ã¯ãªããã¢ãªãã£ã®èŠ³ç¹ããïŒã
- ïŒbïŒ
~A
ãã¹ãŠã®æ£åœãªãã©ã¡ãŒã¿ãŒåTâ, Tâ, ...
ã«ã€ããŠãA<Tâ, Tâ, ...>
ã¯B<Tâ, Tâ, ...>
ãµãã¿ã€ãã§ãªããã°ãªããŸããã
åé¡ã¯ãç©äºãã§ããã ãåçŽã«ä¿ã€ãšãé説çã§èšèªã«é©åããªããµãã¿ã€ãé¢ä¿ã«ãªã£ãŠããŸãããšã§ãã
ããMyPromise<T> extends Promise<T[]>
æ段ã¯MyPromise<T>
䜿çšå¯èœã§ãªããã°ãªãã©ãã§ãPromise<T[]>
䜿çšå¯èœã§ã¯ãããŸããããããã¯ãã¯ãã±ãŒã¹ã ããã
as
ã䜿çšããŠa : MyPromise<T>
ãPromise<T[]>
as
ã«å€æããå Žåãã¢ãããã£ã¹ãã«ãªããŸãããé説çã«a
å²ãåœãŠã容æã«ãªããŸãã
æ¢åã®ãµãã¿ã€ãã®é¢ä¿ã«åŸãæ¢åã®äžè¬çãªå¶çŽã䜿çšããŠãåæ§ã®å¹æãéæããå¥åŠãªåäœãåŒãèµ·ããããšãã§ããŸãã
function id1<A, ~P extends ~PromiseLike>(p : P<A>) : P<A>;
function id2<A, P extends Promise<A[]>>(p : P) : P {
//ERROR - P does not extend PromiseLike<A>
return id1(p);
}
ã¿ã€ãã³ã°ã¯ãå¯äœçšãšããŠãå°ãªããšãéšåçã«ã¯åç®äžã®ãã®ã«ãªããŸãã ãããã®ã¿ã€ãã¯çªç¶ç°ãªããçŸåšã¯åãã§ãã
type GenericNumber<T> = number;
type RegularNumber = number;
åãã©ã¡ãŒã¿ãŒãæã€è€éãªçµå/亀差åãçŽç²ãªæ§é åãã¡ã³ããŒå å è¡šèšãæã€åãªã©ã«ã©ã®ãããªåœ±é¿ãããã®ãââããããããŸããã
ç§ã®å人çãªææ³ã¯æ¬¡ã®ãšããã§ããåã³ã³ã¹ãã©ã¯ã¿ãŒã«å¯Ÿãããµãã¿ã€ãã®é¢ä¿ã¯ãæ¢åã®ãã®ã«å察ããã®ã§ã¯ãªããå°éããå¿ èŠããããŸãã æ²ããããšã«ãããã«ã¯ãã£ãšè€éãªãã®ãå¿ èŠã§ãã
åã³ã³ã¹ãã©ã¯ã¿ãŒã«ããçš®ã®ç¹å¥ãªè¡šèšæ³ã䜿çšããæ倧ã®çç±ã¯ã99ïŒ ã®éçºè ãåã³ã³ã¹ãã©ã¯ã¿ãŒãäœã§ããããç¥ããããããã«é¢ãããšã©ãŒã¡ãã»ãŒãžã§æ»æãããããªããšããããšã§ãã
ããã¯ããã¹ãŠã®éçºè ãåè«ã®äžçŽã³ãŒã¹ãåè¬ããããšãæ³åŸã§çŸ©åä»ããããŠããHaskellãšã¯å€§ããç°ãªããŸãã
äºæ¬¡çãªçç±ã¯ãå Žåã«ãã£ãŠã¯ïŒåè¿°ã®ããã©ã«ãã®ãã©ã¡ãŒã¿ãŒã®å Žåã®ããã«ïŒãæ§æããããŸãã«ãªãããç¹å®ã®åã³ã³ã¹ãã©ã¯ã¿ãŒããŸã£ããæœè±¡åã§ããªãããšã§ãã
ç·šéïŒç³ãèš³ãããŸããã@GregRosç§ã¯ããªãã®åŸè ã®ã³ã¡ã³ããèŠãŸãã
åã³ã³ã¹ãã©ã¯ã¿ãŒã«å¯Ÿãããµãã¿ã€ãã®é¢ä¿ã¯ãæ¢åã®ãã®ã«å察ããã®ã§ã¯ãªããå°éããå¿ èŠããããŸãã
ãããéæã§ããã°ãç§ã¯åæããŸãã ç§ã¯ãã¹ãŠã®è©³çŽ°ãšãããã©ãã»ã©ç°¡åã§ãããã«ã€ããŠé ãæ©ãŸããŠããŸããã
äºæ¬¡çãªçç±ã¯ãå Žåã«ãã£ãŠã¯ïŒåè¿°ã®ããã©ã«ãã®ãã©ã¡ãŒã¿ãŒã®å Žåã®ããã«ïŒãæ§æããããŸãã«ãªãããç¹å®ã®åã³ã³ã¹ãã©ã¯ã¿ãŒããŸã£ããæœè±¡åã§ããªãããšã§ãã
å¶çŽãäœãããå¿ èŠããããŸã§ãåžžã«æé«ã®çš®é¡ã®å¶çŽãæ³å®ãããšããããŸãã«ãªãããšã«åæãããã©ããã¯ããããŸããã ããã¯ã¢ãµãŒã·ã§ã³ã§ã¯ãªããä»ã®äŸã瀺ããŠããå Žåã¯ååã«å ¬å¹³ã§ãã
åé¡ã¯ãç©äºãã§ããã ãåçŽã«ä¿ã€ãšãé説çã§èšèªã«é©åããªããµãã¿ã€ãé¢ä¿ã«ãªã£ãŠããŸãããšã§ãã
ããã¯æ¬åœãããããŸãããç§ã¯ä»£æ¿æ¡ãå®éã«å®è£ ã§ãããã©ããã ããå¿é ã ãšæããŸãã ããè€éãªãœãªã¥ãŒã·ã§ã³ãæ©èœããã°ãããã¯çŽ æŽãããããšã§ãã
ãããã³ã°é¢æ°ã®ååšã瀺ããµãã¿ã€ãã®ããäžè¬çãªæŠå¿µãæã€ããšã¯ãäžè¬çã«å®è£ ããã®ãé£ããããã§ãã 次ã®äŸã¯ã«ãŒã«ãæ£ãã解éããŠããŸããïŒ
ïŒbïŒãAã®ãã¹ãŠã®æ£åœãªãã©ã¡ãŒã¿åT1ãT2ã...ã«å¯ŸããŠãAã次ã®ãããªãBã®ãã©ã¡ãŒã¿åS1ãS2ã...ãååšããŸã
FïŒAãBïŒ=ïŒnumberãBïŒã®ãããã³ã°ãäžããããå Žåã次ã®å ŽåãXã¯Yã®ãµãã¿ã€ãã«ãªããŸãã
type X = ~<A,B> = {x : B};
type Y = ~<A,B> = A extends number ? {x: B} : never;
ãã ãã X<string,number>
ã¯Y<string,number>
ãµãã¿ã€ãã«ã¯ãªããŸããã
ãããã³ã°ã®_ååš_ãååã§ãããã©ããã¯ããããŸããã ãAãšãBãé¢æ°ãšãããBããAã«è¿äŒŒããããšããŸãã¯ãAããBã®ãµãã¿ã€ãã§ããããšã瀺ãããå ŽåããAãaã§ãããããªé¢æ°ãCãããããšã瀺ããŸãã ïŒãBããCïŒã®ãµãã¿ã€ãã§ã¯äžååã ãšæããŸãïŒCã¯ããããŒã§ãïŒã ç§ã¯_all_ãããã³ã°ã®å Žåã§ãªããã°ãªããŸããã
function id1<A, ~P extends ~PromiseLike>(p : P<A>) : P<A>;
function id2<A, P extends Promise<A[]>>(p : P) : P {
//ERROR - P does not extend PromiseLike<A>
return id1(p);
}
ç§ã¯ãã®äŸã«å®å
šã«ã¯åŸããŸãããããã§ãšã©ãŒãçºçããªãããã«ããå¿
èŠããããŸããïŒ ããããèªãã ãšããã id1
ã¯ããã¹ãŠã®_inputs_ã«PromiseLike
ãäžããé¢æ°P
ã«ãã£ãŠæ§ç¯ãããå
¥åãå¿
èŠã§ãããšããããšã§ãã id2
ã¯ãPromiseãA []ã«é©çšãããµãã¿ã€ãã§ãªããã°ãªããªãå€ã«ã€ããŠè©±ããŠããã®ã«å¯ŸããŠã id2
ã¿ã€ãããã id1
ã«å¿
èŠãªæ
å ±ã埩å
ã§ãããã©ããã¯ããããŸããã ç§ã¯ããªãã®äž»åŒµã誀解ããŠãããããããªããšæããŸãã
ãããã®ã¿ã€ãã¯çªç¶ç°ãªããçŸåšã¯åãã§ã
ç¹°ãè¿ãã«ãªããŸãããç§ã¯ããªãã®äž»åŒµãèŠéããŠãããããããŸããããããããã©ã®ããã«åãã§ãããã¯ããããŸããã åå
ã§RegularNumber
ãGenericNumber
ã«çœ®ãæããããšã¯ã§ããŸãããåŸè
ã«åŒæ°ãæå®ããå¿
èŠããããŸãã
ãããã³ã°ã®ååšã§ååãã©ããã¯ããããŸããã ãAãšãBãé¢æ°ãšãããBããAã«è¿äŒŒããããšããŸãã¯ãAããBã®ãµãã¿ã€ãã§ããããšã瀺ãããå ŽåããAãaã§ãããããªé¢æ°ãCãããããšã瀺ããŸãã ïŒãBããCïŒã®ãµãã¿ã€ãã§ã¯äžååã ãšæããŸãïŒCã¯ããããŒã§ãïŒã ç§ã¯ãã¹ãŠã®ãããã³ã°ã«åœãŠã¯ãŸãå¿ èŠããããŸãã
ãããããªãã¯æ£ããã§ãããããŠããªããæäŸããåäŸãããã§ãã ç§ã¯ä»ã®åäŸãèŠã€ããŸããã ãŸã£ããæ©èœããŸããã
ãã®ã¹ã¬ãããšããããã®è¿ä¿¡ãèªã¿çŽããŸããã ç§ã¯ããªããå€ãã®ç¹ã§æ£ãããšæããŸãããããŠç§ã¯ééã£ãæ¹æ³ã§åé¡ãèŠãŠããŸããã ç§ãèšãããããšã説æããŸãã
å¶çŽãäœãããå¿ èŠããããŸã§ãåžžã«æé«ã®çš®é¡ã®å¶çŽãæ³å®ãããšããããŸãã«ãªãããšã«åæãããã©ããã¯ããããŸããã ããã¯ã¢ãµãŒã·ã§ã³ã§ã¯ãªããä»ã®äŸã瀺ããŠããå Žåã¯ååã«å ¬å¹³ã§ãã
ãããŸãã§ããããåç
§ã§ããªããªã£ãŠããŸãã äžèšã®äŸã®ããã«ã Foo
ã®åã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãåèªäœã«ãã£ãŠé ãããŠãããããåç
§ã§ããªããªããŸãã ~Foo
ãæžãããã Foo<*>
ã~<A>Foo<A>
ãªã©ãä»ã®ãã®ãšç«¶åããªããã®ãæžãããããã°ããã®çš®ã®åé¡ã¯çºçããŸããã
ã¯ãããšã€ãªã¢ã¹ãå®çŸ©ããããšã§ãããåé¿ã§ããŸãããããŸããããã§ã¯ãããŸããã
type Foo2<T> = Foo<T>
ç§ãèšã£ãããã«ããããæãéèŠãªæžå¿µäºé ã§ã¯ãªããšæããŸãã
ç§ã¯ãã®äŸã«å®å šã«ã¯åŸããŸãããããã§ãšã©ãŒãçºçããªãããã«ããå¿ èŠããããŸããïŒ ç§ãããããèªãã ã®ã¯ãid1ã«ã¯ããã¹ãŠã®å ¥åã«å¯ŸããŠPromiseLikeãäžããé¢æ°Pã«ãã£ãŠæ§ç¯ãããå ¥åãå¿ èŠã§ãããšããããšã§ãã id2ã¯ãPromiseãA []ã«é©çšãããµãã¿ã€ãã§ãªããã°ãªããªãå€ã«ã€ããŠè©±ããŠããã®ã«å¯ŸããŠã id2ã®ã¿ã€ãããid1ã«å¿ èŠãªæ å ±ãå埩ã§ãããã©ããã¯ããããŸããã ç§ã¯ããªãã®äž»åŒµã誀解ããŠãããããããªããšæããŸãã
ããã¯æ£ããèªã¿æ¹ã§ããããã ãã ãã P extends Promise<A[]>
å Žåã¯ã id1
ãªã©ã Promise<A[]>
ãåãå
¥ããä»»æã®å Žæã«å²ãåœãŠãããšãã§ããŸãã ãããçŸåšã®ç¶æ³ã§ããããµãã¿ã€ãã³ã°ã®æå³ã§ãã
ããé¿ããããªããšæããŸãã
ç¹°ãè¿ãã«ãªããŸãããç§ã¯ããªãã®äž»åŒµãèŠéããŠãããããããŸããããããããã©ã®ããã«åãã§ãããã¯ããããŸããã åå ã§RegularNumberãGenericNumberã«çœ®ãæããããšã¯ã§ããŸãããåŸè ã«åŒæ°ãæå®ããå¿ èŠããããŸãã
ç§ãæå³ããã®ã¯ããã§ãïŒãã¹ãŠã®T
ã®ã¿ã€ãGenericNumber<T>
ãšãã¿ã€ãRegularNumber
ã¯åäžã§äº€æå¯èœã§ãã äžæ¹ããã§ãã¯ãå
¥åããããäžæ¹ãå
¥åããªãã³ã³ããã¹ãã¯ãããŸããã å°ãªããšãä»ã¯ã
ç§ãã¡ã話ããŠããããšã¯ããããéããã®ã«ããã§ãããã GenericNumber<T>
ã¯TCããã®ãã®ã§ããããã RegularNumber
ãã§ããªãå Žæã§
ç§ã¯ããã«ã€ããŠèããŸããããããŠããã¯é¿ããããªããããããªããŠãå¿ ãããæªãããã§ã¯ãªããšæããŸãã ãã æ°ãããç°ãªãæ¯ãèãã
ããã«ã€ããŠèãã1ã€ã®æ¹æ³ã¯ãtypeãã©ã¡ãŒã¿ãŒãtypeã®ãæ§é ãã®äžéšã«ãªããšããããšã§ãã
TCã¯ãã£ãšç°ãªãè¡åã«ã€ãªãããšæããŸãã
ãŸã第äžã«ãæ£ãããµãã¿ã€ãã®é¢ä¿ã¯ãããã³ã°ãæããªãé¢ä¿ã§ãããšããç¹ã§ããªãã¯æ£ãããšæããŸãã
ç§ã®æåã®ã¢ã€ãã¢ã¯æ¬¡ã®ãšããã§ããã
~A
ã~B
ãµãã¿ã€ãã«ãªãå ŽåïŒ
- ïŒaïŒãããã¯åãçš®é¡ã§ãªããã°ãªããŸããïŒå¶çŽã§ã¯ãªããã¢ãªãã£ã®èŠ³ç¹ããïŒã
- ïŒbïŒ
~A
ãã¹ãŠã®æ£åœãªãã©ã¡ãŒã¿ãŒåTâ, Tâ, ...
ã«ã€ããŠãA<Tâ, Tâ, ...>
ã¯B<Tâ, Tâ, ...>
ãµãã¿ã€ãã§ãªããã°ãªããŸããã
ãããã³ã°ã®ããš...æ£çŽãªãšãããããã¯ããªãæãã§ãã MyPromise<T> extends Promise<T[]>
ãš~Promise
ãçµ±åããæ¹æ³ã¯ãããªããšæããŸãã 誰ããä»ã®ããšãèããŠãããã©ããç¥ãããã§ãã
ãŸãããã®ã«ãŒã«ã§ãæ©èœããªãäŸããªããã©ãããç¥ãããã§ãã
åã³ã³ã¹ãã©ã¯ã¿ãŒã®å¶çŽããµãã¿ã€ãã®é¢ä¿ã䜿çšããŠè¡šçŸãããããšã«åæããå Žåãããã¯éåžžã«ããŸãæ©èœããŠããããã«èŠããŸãããä»ã®ããšã«ç§»ãããšãã§ããŸãã
ç§ãã¡ã¯ãã®åé¡ã«ã€ããŠå®éã«ã¯åæããŠããªãããã§ãã ~Promise
䌌ããã¬ãã£ãã¯ã¹æ§æã匷ã奜ã¿ãŸãã æŠå¿µçã«ã¯ã ~
ã¯ããã®TCãžã®åç
§ãæŒç®åãªã©ãšèŠãªãããšãã§ããŸãã
ç§ã¯ããã代æ¿æ¡ãããåªããŠããããã€ãã®çç±ãæãããšæããŸãïŒ
Promise
æžã蟌ãã å Žåããšã©ãŒã¡ãã»ãŒãžã¯çŸåšãšãŸã£ããåãã«ãªããŸãã TCã«ã€ããŠè©±ãããã«å€æŽããå¿
èŠã¯ãããŸããã~\w
ã¯ãTCãžã®åç
§ã瀺ããŠãããšèŠãªãããŸããä»ã®æ¹ã«ããæèŠãããã ããã°å¹žãã§ãã
* & (* => *)
ã * | (* => *)
ãªã©ã®ãã©ãŒã ã®ãªãŒããŒããŒã/æ··åã®çš®é¡ã¯åæ³ã§ããïŒ ãããã«ã¯èå³æ·±ãçšéããããŸããïŒ
ãããã¯æªãèãã§ãããæšè«ããã®ã¯é£ãããšæããŸãã ãŸãã * | (* => *)
ãæ確ã«ããŠãããããåãäœæã§ããããã«ããããã«å¿
èŠãªå泚éã®çš®é¡ãããããŸããã
ãã®ãããªçš®é¡ãçŸåšååšããŠãããšèšãã1ã€ã®æ¹æ³ã¯ãããã©ã«ãã®åãã©ã¡ãŒã¿ãŒãæã€åã§ãã
type Example<A = number> = {}
ãã®åã¯ãåãã©ã¡ãŒã¿ãåãå
¥ããŠåãæ§ç¯ã§ãããããçš®é¡* & (* => *)
ãããšèšããŸãããå¿
ãããããããå¿
èŠã¯ãããŸããã
ããã©ã«ãã®åãã©ã¡ãŒã¿ãŒã¯ãåã説æããæ¹æ³ã§ã¯ãªããçç¥åœ¢ã§ããå¿ èŠããããšæããŸãã ãããã£ãŠãã¿ã€ãã®çš®é¡ã決å®ãããšãã¯ãããã©ã«ãã®ã¿ã€ããã©ã¡ãŒã¿ãç¡èŠããå¿ èŠããããšæããŸãã
ãã ãã ~Promise | ~Array
ãªã©ã®ã¿ã€ãã«ã€ããŠè©±ãããšã¯çã«ããªã£ãŠããå ŽåããããŸãã ãããã¯åãçš®é¡ãªã®ã§ãäºææ§ã¯ãããŸããã ããã¯ãµããŒãããã
次ã®ãããªé¢é£ããç¶æ³ã«å¯ŸåŠããå¿ èŠããããŸãã
type Example = (<~P extends ~Promise>() => P<number>) | (<~M extends ~Map>() => Map<string, number>);
ããããããã¯å®éã«ã¯çš®é¡(* => *) | (*, *) => *
å«ã¿ãŸããããäœãå¥ã®ãã®ã§ã
åã«è¿°ã¹ãããã«ã * => (* => *)
ãããªä»ã®TCãæ§ç¯ããTCãçšæããã®ã¯è¯ãèãã§ã¯ãªããšæããŸãã ãããã¯ã«ãªãŒåãªã©ããµããŒãããèšèªã§ã¯æšæºã§ãããTypeScriptã§ã¯æšæºã§ã¯ãããŸããã
~
æ§æãšãµãã¿ã€ãã®é¢ä¿ã䜿çšããŠãã®ãããªåãå®çŸ©ããããšãç§ãèŠãããšãã§ããæ¹æ³ã¯ãŸã£ãããªãã®ã§ãããããçŠæ¢ããããã®ç¹å¥ãªèŠåã¯å¿
èŠãããŸããã ããããæ©èœãããã«ã¯ç¹å¥ãªã«ãŒã«ãå¿
èŠã«ãªããŸãã
ããããã次ã®ããã«æ§é çã«å®çŸ©ã§ãããšæããŸãã
~<A>~<B>{a : A, b : B}
ãããç§ãèããå¯äžã®æ¹æ³ã§ãã
åãã©ã¡ãŒã¿ãŒãåãåãé¢æ°åãšã®èªç¶ã§ã¯ãããè€éãªçžäºäœçšããããŸãã
type Example<T> = <~P extends ~Promise>(p : P<T>) : P<T>;
ãã®çžäºäœçšãäœããã®æ¹æ³ã§åæ¢ããå¿ èŠããããŸããïŒ ãã®ãããªã¿ã€ãã¯éåžžã«è€éã«ãªã£ãŠããããšãããããŸãã
äžè¬çã«ãTCãã©ã¡ãŒã¿ã衚瀺ããŠã¯ãããªãå Žæã¯ãããŸããïŒ
ããã«å®è£ ããå¿ èŠã¯ãªããšæããŸãããããã§ãç§ã®æ§é æ§æã¯è¯ãèãã ãšæããŸãã ããã¯ããªããå¯èœã«ããŸãïŒ
~<A>Map<string, A>
ã ~<A, B>Map<B, A>
ãªã©ã®éåžžã«æ瀺çã§æè»ãªæ¹æ³ã§ãåã³ã³ã¹ãã©ã¯ã¿ãŒãéšåçã«é©çšããŸãããšã¯èšããã®ã®ãTCã¯ããããªããŠãå®å šã«æ©èœããå¯èœæ§ããããæåã®PRã§ã¯ããããTCãé¢äžããŸããã
æ©èœã¯æ¡ä»¶ä»ãã¿ã€ãã§ã©ã®ããã«æ©èœããŸããïŒ ããªãã¯ãããè¡ãããšãã§ããã¹ãã§ããïŒ
type Example<~P extends ~PromiseLike> = ~P extends ~Promise ? 0 : 1
èªåèªèº«ã¯å®å šã«ã¯ããããŸããã æ¡ä»¶ä»ãåã¯ãŸã å®å šã«æ¶åãããŠããŸããã
ããã¯ããã¥ããæ°ãããŸãã ããŸããŸãªåœ¢åŒã®éè² è·è§£æ±ºã«ãã£ãŠããŸããŸãªã¿ã€ããäœæããããããããã¯å®éã«ã¯éåžžã«éèŠã§ãã
ãšã¯ãããä»ã®ãšããè¯ãäŸã¯æãã€ããªãã
æ確ã«å®çŸ©ãããäžéèšèªã䜿çšããŠTypeScriptãéå§ç¹ãšããŠèšè¿°ããå Žåãããã®å€ãã¯éèŠãªãã€ã³ãã§ããã äŸïŒã·ã¹ãã F <ïŒãŸãã¯Simplified DependentMLãªã©ã®ãµãŠã³ãäŸååã·ã¹ãã ã®1ã€ã
ãããåã«è§£æ±ºããããæ£çŽé©ãããã
https://github.com/Microsoft/TypeScript/issues/14833
ïŒ17961ã¯ãããããããéæ¥çã«è§£æ±ºã§ãããšæããŸãã 詳现ã«ã€ããŠã¯ããã®èŠç¹ãåç §ããŠãã ããã
Bifunctor
ãšProfunctor
åã¯ãå¶çŽã¬ãã«ã§ã¯å°ãè€éã§ããããšã«æ³šæããŠãã ããã infer T
ã§ã¯ãªããæããã«ãŠãããŒãµã«åã䜿çšããæ¹ãã¯ããã«ç°¡åã§ãã this
ããæ»ãå€ã®åãïŒçŽç²ã«åã¬ãã«ïŒãšããŠäœ¿çšã§ããã°ãã»ãšãã©ã®ã€ã³ã¿ãŒãã§ã€ã¹ã®å®çŸ©ãç°¡åã«ãªããŸãã
ïŒç§ã¯TSã®ãããŒãŠãŒã¶ãŒã§ã¯ãªãã®ã§ãééããç¯ããå¯èœæ§ããããŸãã @ tycho01ãããèŠãŠãã¿ã€ãã®æ··ä¹±ã®ã©ããã§å€±æãããã©ããã確èªããŠãã ãããç§ãå°ããçç±ã¯ãããªããåŸãã«ããããã§ããäžèšã®PRããããŠç§ã¯ããªãã®ä»ã®å®éšããŠãŒãã£ãªãã£ã®ããã€ããèŠãŠããŸãããïŒ
@isiahmeadows @ tycho01ãããŒ...
ããªããæ£ããã ç§ããããæ£ããç解ããã°ãããã¯ã»ãšãã©åãçµæããããããŸãã
ããã€ãã®éãããããŸãã ããããæ©èœçã«ã¯ã»ãšãã©åãã§ããããããã®éãã¯è§£æ±ºã§ãããšæããŸãã
function example<~P extends ~PromiseLike>(p : P<number>) : P<string>;
ããã§ã ~Bluebird
ããp
~Promise
ãš~Bluebird
ãæšæž¬ã§ããŸãã ãã ãã次ã®ããã«ãããšã次ã®ããã«ãªããŸãã
function example<F extends <T>(t: T) => PromiseLike<T>>(p : F(number)) : F(string)
ç§ã¯ãããããŸããããã©ããéåžžã«çã£ãŠããŸãïŒ
example(null as Promise<number>)
F
ã次ã®ããã«æå³ãããŠãããšæšæž¬ããæ¹æ³ã¯ãããŸããã
<T>(t : T) => Promise<T>
ãã®æ©èœã¯ç¹å¥ãªãã®ãšã¯èŠãªãããªãããã§ãã äžæ¹ãTCã®å Žåãäžéšã®åã«ã¯åºæ¬çã«ãæé»ã®ãåã¬ãã«ã®æ©èœããããŸããããã¯TCã§ãã
ç§ã®ææ¡ã®ããã«~Promise
è¡ãããšã¯ã§ããŸããã æ§é 圢åŒã䜿çšããŠãåãçŽæ¥ãšã³ã³ãŒãããå¿
èŠããããŸãã
type PromiseTC = <T>() => Promise<T>
確ãã«ãããã¯æžå¿µäºé ã§ãã ããã¯ãæ¢ç¥ã®åŒæ°åããæ±çšé¢æ°èªäœãæšè«ããæ©èœãå¿ èŠãªåæšè«ã®åé¡ã§ãïŒéåžžçºçããã®ãšã¯éã§ãïŒã ã»ãšãã©ã®å Žåã«æ©èœããã®ã«ååäžè¬çãªæ¹æ³ã§è§£æ±ºã§ããŸãããéèŠãªæ°ããç¹æ®ãªã±ãŒã¹ãå¿ èŠã§ãã
NoInfer<T>
ãæŠç¥çã«äœ¿çšããããšã§éšåçã«è§£æ±ºã§ãããããããŸãããããããã©ã®ããã«è¡ãå¿
èŠãããã®ãââããããŠäžè¬çãªã±ãŒã¹ã§ããã©ãã ã察åŠã§ããã®ãã100ïŒ
確信ã¯ãããŸããã
@GregRos
ç§ã¯æ§æã匷ãæ¯æããŠããŸãããããã¯ç§ã®å¥œã¿ã§ããã ~
ã«ã¯å€ãã®ã¡ãªããããããŸãã æšè«ãåžžã«å¯èœã§ãããšã¯éããªããããèæ
®ãã¹ãäž»ãªããšã¯ãæ瀺çãªçš®é¡ã®æ³šéã®æ§æãå¿
èŠãã©ããã ãšæããŸãã
ãããã³ã°ã®ããš...æ£çŽãªãšãããããã¯ããªãæãã§ãã MyPromiseãçµ±åããæ¹æ³ã¯ãªããšæããŸã
Promiseãæ¡åŒµããŸã
ãããã³ã°ã®ããšã¯ãŸã æçšãªæŠå¿µã ãšæããŸãããäžèšã®å Žåã ~MyPromise
ã~Promise
ãšçµ±åããããšããã¹ãã§ã¯ãªããšæããŸããçµ±åããå¿
èŠããããã®ã§ããã¯~MyPromise
ãš~<T>Promise<T[]>
ã§ããã ~(Promise . [])
æžãããšãã§ããŸãã æ¬ ããŠããã®ã¯ããããã³ã°ããµãã¿ã€ãé¢ä¿ã®äžéšã§ããå¿
èŠããããšããããšã ãšæããŸããããã¯Promise
ãšåããããã³ã³ã¹ãã©ã¯ã¿ãŒã®äžéšã§ãã ãã®äŸã§ã¯ããããã³ã°ã¯åãªããªã¹ãã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã
interface A<T> {
x: T;
}
interface B<T> {
x: T[];
}
~<T>B<T>
ã¯~<T>A<T[]>
æ¡åŒµããŸããïŒ ã¯ãã ~<T>B<T>
ã¯~<T>A<T>
æ¡åŒµããŸããïŒ ããããããããæçµçã«ã¯2ã€ã®ç¡é¢ä¿ãªè³ªåã§ãã
åã³ã³ã¹ãã©ã¯ã¿ãŒã®å¶çŽããµãã¿ã€ãã®é¢ä¿ã䜿çšããŠè¡šçŸãããããšã«åæããå Žåãããã¯éåžžã«ããŸãæ©èœããŠããããã«èŠããŸãããä»ã®ããšã«ç§»ãããšãã§ããŸãã
ã¯ããããã¯ç©äºã説æããè¯ãæ¹æ³ã®ããã«æããŸãã
æ£ããåé¢æ°ãæšæž¬ããããšã¯ã§ããŸãã
function example<~P extends ~PromiseLike>(p : P<number>) : P<string>;
ããã§ã¯ãpãã~Promise
ãš~Bluebird
ãæšæž¬ã§ããŸãã
ããã¯ã¢ãµãŒã·ã§ã³ã§ã¯ãªããåãã§ãã¯ãã©ã®ããã«æ©èœãããå®å
šã«ã¯ããããªãããããããªãŒãã³ãªè³ªåã§ãã äžèšã®ã€ã³ã¿ãŒãã§ãŒã¹A
äŸãšããŠäœ¿çšãããšãã¿ã€ãA<number>
ãš{x: number}
ã¯åºå¥ã§ããªããããã³ã³ã¹ãã©ã¯ã¿ãŒãæšæž¬ã§ãããã©ããã¯ããããŸãããã³ã³ã¹ãã©ã¯ã¿ãŒã®ã¢ããªã±ãŒã·ã§ã³ããè¿ãããåããã P<number>
ããP
ãå埩ããããšã¯å¯èœã§ããããïŒ ããããµããŒãããããã«ç©äºãå€æŽãããå¯èœæ§ããããšç¢ºä¿¡ããŠããŸããç§ã¯ãããä»äœãããŠããã®ãçåã«æã£ãŠããŸãã
ïŒ17961ããã®ã¯ãã¹ã¬ã¹ãã³ã¹ã§ãããæ®å¿µãªãã@isiahmeadowsã®ã¢ãããŒããæ©èœãããæ¹æ³ã
ãããã£ãŠãå
¥åPromise<number>
ãŸãã¯Bluebird<number>
ã«åºã¥ããŠããããã®ã¿ã€ãã®æªé©çšããŒãžã§ã³ãæšæž¬ããŠãããšãã°string
åé©çšã§ããããã«ãããããã§ãã ã§ãããã¯é£ããã§ããã
å
¥ååãæ§é çã«åçã®ãã®ã§ã¯ãªããã®ãããªãã®ã§ãã£ãŠãïŒæ§é çã«åä»ããããèšèªã§ãããïŒïŒãããšãã°Bluebird
ã«2ã€ã®ãã©ã¡ãŒã¿åãããå Žåããã®æšè«ãææ§ã«ãªããŸãããã®æç¹ã§<string>
åã®paramã¢ããªã±ãŒã·ã§ã³ã¯ãã¯ãæå³ããªããªããããããŸããã
ç§ã¯ããã«è¯ã解決çãããããŸããã ïŒå
責äºé
ïŒããã§ã®è°è«ã¯å°ãé
ããŠããŸããïŒ
@ tycho01人ã
ãT
æ瀺çã«ã€ã³ã¹ã¿ã³ã¹åããå Žåããããã®åé¡ã¯ãã¹ãŠè§£æ¶ãããŸããïŒ
ãšã«ãããã¹ãŠã®å Žåã«æšè«ã解決ã§ãããšã¯æããªãã®ã§ãããã¯åççã ãšæããŸãã
@ jack-williamsïŒãããŸã§ã®ãšããïŒ17961ã§ã¯ãããŸãããããã£ã¹ãããã«äœ¿çšãããšåœ¹ç«ã€ãšæããŸãã
let arr = [1, 2, 3];
let inc = (n: number) => n + 1;
let c = arr.map(inc); // number[]
let map = <Functor extends { map: Function }, Fn extends Function>(x: Functor, f: Fn) => x['map'](f); // any on 2.7 :(
let e = map(arr, inc);
@ tycho01ã¯ããã¡ãœããåŒã³åºãã§T
ãã€ã³ã¹ã¿ã³ã¹åãããŠããªããããç§ã®ææ¡ãã²ã©ãããšã«æ°ã¥ããŸããã
次ã®ãããªãã®ã¯åäœããŸããïŒ
interface TyCon<A> {
C: <A>(x: A) => TyCon<A>
}
interface Functor<A> extends TyCon<A> {
C: <A>(x: A) => Functor<A>;
fmap<B>(this: this["C"](A), f: (x: A) => B): this["C"](B);
}
interface Option<A> extends Functor<A> {
C: <A>(x: A) => Option<A>;
}
@ jack-williamsåé¡ã¯ãåäœãfp-ts
ã®ADTå®è£
ãšã©ã®ããã«æ¯èŒãããããšããããšã ãšæããŸãããããã¯ããŸãããããã§ãã ããããTyCon
ããããŸããã
@ jack-williams @isiahmeadows ïŒ
ãã§ã«$Call
å©çšå¯èœã§ãããããtryflowã§ã¢ã€ãã¢ãè©ŠããŸããã ç§ã«ãšã£ãŠã¯ã©ããããããåå¿ããªããªã£ãããã§ãã...
interface Functor<A> {
C: <A>(x: A) => Functor<A>;
fmap<B>(f: (x: A) => B): $Call<$ElementType<this, "C">, B>;
}
// this: $Call<$ElementType<this, "C">, A>,
// ^ flow doesn't seem to do `this` params
interface Option<A> extends Functor<A> {
C: <A>(x: A) => Option<A>;
}
let o: Option<string>;
let f: (s: string) => number;
let b = o.fmap(f);
@ tycho01 this
ãããŒãã$ElementType
ããããã£ãååŸããããšã¯ã§ããªããšæããŸã
@ tycho01å®éã«ã¯ãããtypescriptã§ãæ©èœãããããšã¯ã§ããŸãã
éã³å ŽïŒ https ïŒ
@goodmind ïŒFunctor
ããMaybe
fmap
ãã³ããŒããåŸã Functor<number>
Maybe<number>
ã§ã¯ãªã
ååŒã³åºãã䜿çšãããšãåã®å®è¡æå®è£
ãå¿
èŠã«ãªãã®ã§ã¯ãªããåã ããååšããããã«æ¹åããããšæããŸãã
ããŠããã¡ã³ã¯ã¿ãŒã¯ãã§ã«ç¬èªã®fmap
å®è£
ãå¿
èŠãšããŸãã ããããããã¯æŽŸçã¡ãœããã«ãšã£ãŠã¯ææªã§ãã
æ¯ãåºãã«æ»ã£ãŠã ïŒ/
https://github.com/SimonMeskens/TypeProps/issues/1ã§ããã€ãã®é¢é£ããã¢ã€ãã¢
ã¢ã«ãã¡çãã§ããã ãæ©ããªãªãŒã¹ããäºå®ã§ããããã®å·ã®äŸãæžããŠããç§ãšäžç·ã«ãã©ããŒããŠããã§ã«ãã®æ觊ãã€ããããšãã§ããŸãã
ãã®ç¹å®ã®åé¡ãå®å šã«è§£æ±ºããã«ã¯å°ãæéãããããŸãããç§ãæ¢ããŠããã®ã¯åçŽãªå 容ã§ããããã©ã¡ãŒã¿ãŒåãããæ±çšåããªãããã«å ¥åã§ããªãã³ãŒãã®å®éã®äŸã§ãã ç§ã¯ãããã®ã»ãšãã©ãå ¥åã§ãããšæããŸãïŒæœè±¡ãªããåã³ã³ã¹ãã©ã¯ã¿ãŒã«äŸåããªãå ŽåïŒã äžèšã®ãªããžããªã§ã³ãŒãã䜿çšããŠåé¡ãèªç±ã«éããŠãã ãããå¯èœã§ããã°ãå ¥åããŸãïŒãŸãã¯ãããã«æçš¿ããããšãã§ããŸãïŒã
ãããºã¢ããç§ã¯ïŒ23809ã§ãããå®è£ ããè©Šã¿ãå§ããŸããã ãŸã éåžžã«äžå®å šã§ãããèå³ãããã°ãã§ãã¯ããŠãã ããã
ç§ã¯ããªããã¡ã«ç°¡åãªäŸãçŽæããŸãããããã«ãããŸãã ããã¯ãã©ã€ãã©ãªã®äœæããåŠãã ããã€ãã®ããªãã¯ã䜿çšããŠããŸãã
type unknown = {} | null | undefined;
// Functor
interface StaticFunctor<G> {
map<F extends Generic<G>, U>(
transform: (a: Parameters<F>[0]) => U,
mappable: F
): Generic<F, [U]>;
}
// Examples
const arrayFunctor: StaticFunctor<any[]> = {
map: <A, B>(fn: (a: A) => B, fa: A[]): B[] => {
return fa.map(fn);
}
};
const objectFunctor: StaticFunctor<object> = {
map: <A, B>(fn: (a: A) => B, fa: A): B => {
return fn(fa);
}
};
const nullableFunctor: StaticFunctor<object | null | undefined> = {
map: <A, B>(
fn: (a: A) => B,
fa: A | null | undefined
): B | null | undefined => {
return fa != undefined ? fn(fa) : fa;
}
};
const doubler = (x: number) => x * 2;
const xs = arrayFunctor.map(doubler, [4, 2]); // xs: number[]
const x = objectFunctor.map(doubler, 42); // x: number
const xNull = nullableFunctor.map(doubler, null); // xNull: null
const xSome = nullableFunctor.map(doubler, 4 as number | undefined); // xSome: number | undefined
const functor: StaticFunctor<unknown | any[]> = {
map(fn, fa) {
return Array.isArray(fa)
? arrayFunctor.map(fn, fa)
: fa != undefined
? objectFunctor.map(fn, fa)
: nullableFunctor.map(fn, fa);
}
};
const ys = functor.map(doubler, [4, 2]); // ys: number[]
const y = functor.map(doubler, 42); // y: number
const yNull = functor.map(doubler, null); // yNull: null
const ySome = functor.map(doubler, 42 as number | undefined); // ySome: number | undefined
// Plumbing
interface TypeProps<T = {}, Params extends ArrayLike<any> = never> {
array: {
infer: T extends Array<infer A> ? [A] : never;
construct: Params[0][];
};
null: {
infer: null extends T ? [never] : never;
construct: null;
};
undefined: {
infer: undefined extends T ? [never] : never;
construct: undefined;
};
unfound: {
infer: [NonNullable<T>];
construct: Params[0];
};
}
type Match<T> = T extends infer U
? ({} extends U ? any
: TypeProps<U>[Exclude<keyof TypeProps, "unfound">]["infer"]) extends never
? "unfound"
: {
[Key in Exclude<keyof TypeProps, "unfound">]:
TypeProps<T>[Key]["infer"] extends never
? never : Key
}[Exclude<keyof TypeProps, "unfound">] : never;
type Parameters<T> = TypeProps<T>[Match<T>]["infer"];
type Generic<
T,
Params extends ArrayLike<any> = ArrayLike<any>,
> = TypeProps<T, Params>[Match<T>]["construct"];
ãµã³ãã«ãæŽæ°ããŠç°¡ç¥åããŸãããããã«ãéã³å Žã®ãªã³ã¯ããããŸãã
éã³å Ž
äžèšã®NPMã©ã€ãã©ãªãè¿œå ããã®ã§ãç°¡åã«æäœã§ããŸãã ç§ãé©åãªãã¹ããåãããŸã§çŸåšã¢ã«ãã¡çã§ãããHKTãæžã蟌ãããšããŠããçããã®å©ãã«ãªãã¯ãã§ãã
ç§ã¯ãæ¡ä»¶ä»ãåã䜿çšããŠé£œååå ã®ä»®æ³åå€æ°ã眮ãæããããšã«ãããHKTãã·ãã¥ã¬ãŒãããç°¡åãªã¢ãããŒãã§éãã§ããŸãã
declare const index: unique symbol;
// A type for representing type variables
type _<N extends number = 0> = { [index]: N };
// Type application (substitutes type variables with types)
type $<T, S, N extends number = 0> =
T extends _<N> ? S :
T extends undefined | null | boolean | string | number ? T :
T extends Array<infer A> ? $Array<A, S, N> :
T extends (x: infer I) => infer O ? (x: $<I, S, N>) => $<O, S, N> :
T extends object ? { [K in keyof T]: $<T[K], S, N> } :
T;
interface $Array<T, S, N extends number> extends Array<$<T, S, N>> {}
// Let's declare some familiar type classes...
interface Functor<F> {
map: <A, B>(fa: $<F, A>, f: (a: A) => B) => $<F, B>;
}
interface Monad<M> {
pure: <A>(a: A) => $<M, A>;
bind: <A, B>(ma: $<M, A>, f: (a: A) => $<M, B>) => $<M, B>;
}
interface MonadLib<M> extends Monad<M>, Functor<M> {
join: <A>(mma: $<M, $<M, A>>) => $<M, A>;
// sequence, etc...
}
const Monad = <M>({ pure, bind }: Monad<M>): MonadLib<M> => ({
pure,
bind,
map: (ma, f) => bind(ma, a => pure(f(a))),
join: mma => bind(mma, ma => ma),
});
// ... and an instance
type Maybe<A> = { tag: 'none' } | { tag: 'some'; value: A };
const none: Maybe<never> = { tag: 'none' };
const some = <A>(value: A): Maybe<A> => ({ tag: 'some', value });
const { map, join } = Monad<Maybe<_>>({
pure: some,
bind: (ma, f) => ma.tag === 'some' ? f(ma.value) : ma,
});
// Not sure why the `<number>` annotation is required here...
const result = map(join<number>(some(some(42))), n => n + 1);
expect(result).toEqual(some(43));
ããã«ãããžã§ã¯ãïŒ https ïŒ
ãã£ãŒãããã¯ãæè¿ããŸãïŒ
@pelotomç§ã¯ããªãã®ã¢ãããŒãã®æ§æã®è»œãã奜ãã§ãã ãã®ã¹ã¬ããã§ã¯ãŸã èšåãããŠããªãä»ã®2ã€ã®ã¢ãããŒãããããçŸåšããã³å°æ¥ã®ãœãªã¥ãŒã·ã§ã³ã®äœææ¹æ³ã«åµé æ§ãããç«ãŠãå¯èœæ§ããããŸãã ã©ã¡ãããã®åé¡ã«å¯Ÿãããªããžã§ã¯ãæåã®ãœãªã¥ãŒã·ã§ã³ã§ãã
äŸã¯ãšããã§ã«å¡ã«ãããŸãããTypeScriptãžã®å€§ãŸããªç¿»èš³ã¯æ¬¡ã®ããã«ãªããŸãã
https://gist.github.com/mlhaufe/089004abd14ad8e7171e2a122198637f
äžéã¯ã©ã¹è¡šçŸãå¿ èŠãªãããããªãéããªãå¯èœæ§ããããŸãããã¯ã©ã¹ãã¡ã¯ããªã®åœ¢åŒãŸãã¯TypeScript Mixinã¢ãããŒãã䜿çšãããšããããå€§å¹ ã«æžããããšãã§ããŸãã
ïŒ17588ã«é©çšã§ããå ŽåããããŸã
C<T>
ã¯App<t,T>
ã§è¡šãããŸããããã§ã T
ã¯ã¯ã©ã¹ã§ããã t
ã¯C
é¢é£ä»ããããäžæã®ã¿ã°ã§ãã
interface App<C,T> {}
ãµã³ãã«ïŒ
interface IApp<C,T> {}
interface IList<C> {
Nil<T>(): IApp<C,T>
Cons<T>(head: T, tail: IList<C>): IApp<C,T>
}
// defining data
abstract class List<T> implements IApp<typeof List, T> {
// type-safe down-cast
static prj<U>(app: IApp<typeof List, U>): List<U> { return app as List<U> }
}
class Nil<T> extends List<T> { }
class Cons<T> extends List<T> {
constructor(readonly head: T, readonly tail: List<T>) {
super()
}
}
// The abstract factory where the HKT is needed
class ListFactory<T> implements IList<typeof List> {
Nil<T>(): IApp<typeof List, T> { return new Nil() }
Cons<T>(head: T, tail: IApp<typeof List, T>): IApp<typeof List, T> {
return new Cons(head, tail)
}
}
詳现ãšæ£åœåã«ã€ããŠã¯ã次ã®è«æã®ã»ã¯ã·ã§ã³3.5ãåã³ã³ã¹ãã©ã¯ã¿ãŒããªã¢ãŒãã£ãºã ã®ãšãã¥ã¬ãŒãããåç §ããŠãã ããã
https://blog.acolyer.org/2015/08/13/streams-a-la-carte-extensible-pipelines-with-object-algebras/
@metaweta ããã®åé¡ã®ååãHigher kinded types in TypeScript
ããŠãGoogleæ€çŽ¢ããã®èŠèªæ§ãé«ããããšãã§ããŸããïŒ
ãããããç§ãã¡ã®è³¢æã§æ æ²æ·±ããªããžããªã¡ã³ããïŒããšãã°ã @ RyanCavanaugh ã @ DanielRosenwasser ïŒã¯ããã®ãããªå€æŽã圌ãã®ä»å ¥ã«å€ãããšèŠãªãããå Žåãã¿ã€ãã«ãç·šéã§ããŸããïŒ
ãããã³ãã¥ããã£ããããã¯ãã°ã«ç§»åããããšã®æå³ãç¥ãããã§ãã ããã¯ã³ã¢ããŒã ãçŸåšããçå£ã«æ€èšããŠããããšã§ããããããšãåã«ããŒã ãããã¯è¯ãã³ãã¥ããã£åè£ã§ã¯ãªããšå€æããããšãæå³ããŸããïŒ
èŠã€ãã£ãïŒ ãã³ãã¥ããã£ããã€ã«ã¹ããŒã³ã¯ãããã¯ãã°ããã€ã«ã¹ããŒã³ãåªå ããŠéæšå¥šã«ãªã£ãŠããããã§ãããããã£ãŠããã®åé¡ã¯ããããçŸç©ã§ç§»è¡ãããŸããã
TSã¡ã³ããŒã§ã¯ãªããåãã€ã«ã¹ããŒã³ããããªã³ã¯ãã¯ãªãã¯ããããšã決å®ãã人ã ãã§ãã
+1
ãããç§ãæ§ç¯ããããšããŠãããã®ã§ãããçš®é¡ã®å€ãã¿ã€ãã®å®éçãªã±ãŒã¹ã®ããã§ãã
åæãŸãã¯éåæã§å®è¡ã§ããããŒã¿ããŒã¹ã®æœè±¡åãäœæããããšæããŸãã ã³ãŒã«ããã¯ã䜿çšããŠãããããã¯ããã®ã§ã¯ãªãããžã§ããªãã¯ã䜿çšãããã£ãã®ã§ãã ãããç§ãããããããšã§ãïŒ
type Identity<T> = T
interface DatabaseStorage<Wrap<T> extends Promise<T> | Identity<T>> {
get(key: string): Wrap<any>
set(key: string, value: any): Wrap<void>
}
ããã¯æ¬åœã«åŒ·åã§ãïŒ
@ccorcosããã¯MTLã¹ã¿ã€ã«ãšåŒã°ããŸãã fp-tsã䜿çšããçŽç²ãªæ©èœäŸã«ã€ããŠã¯ã httpsïŒ//github.com/gcanti/fp-ts/blob/master/tutorials/mtl.tsãåç §ããŠ
@mlegenhausenç³ãèš³ãããŸãããããã®äŸã«åŸãã®ã«èŠåŽããŠããŸãã
fp-ts
ãæãäžãããšãã¯ãã€ã§ããç©äºãéåžžã«è€éã«ãªããããããªãã®ã§ã¯ãªãããšå¿é
ããŠããŸãã @pelotomã®äŸã¯ããããããããã«èŠããŸãã...
ãããTypeScriptã«æ¡çšãããªãçç±ã¯äœã§ããïŒ
@ccorcos IMHO fp-ts
ã®äŸããå§ããããšããŠããMTL /ã¿ã°ã¬ã¹ã¹ã¿ã€ã«ã¯ãŸã£ãããå§ãããŸããã æåã§ç®¡çããå¿
èŠããããã¹ãŠã®å¹æçãªã¢ããã«æœè±¡åã¬ã€ã€ãŒãè¿œå ãããšãtypescriptã¯äœ¿çšããã¢ãããæ€åºã§ããããããè€éã«ãªããŸãã fp-ts
ã³ãã¥ããã£ãããããã®ã¯ã1ã€ã®éåæã¢ããïŒ TaskEither
ããå§ãããŸãïŒã䜿çšãããããç¶æããããšã§ãã MTLã®å©ç¹ããã¹ãããå Žåã§ãããã¹ãããªãã³ãŒãã§æéããããã ãã®äŸ¡å€ã¯ãããŸããã fp-ts
åºã¥ãhyper-tsã¯ãæè¿MTLã®ãµããŒããçµäºããã©ã€ãã©ãªã®äžäŸã§ãã
èå³æ·±ã... hyper-ts
ã¯æ¬åœã«ã¯ãŒã«ã«èŠããŸã...
F-bounded polymorphismã«åºã¥ãã軜éã§çš®é¡ã®å€ãã¿ã€ãã®ãšã³ã³ãŒãã£ã³ã°ãæãã€ããŸããïŒ https ïŒ
ãã®ã¢ãããŒãã®å©ç¹ã¯ãåã³ã³ã¹ãã©ã¯ã¿ãŒãåã«é¢é£ä»ããããã«ã«ãã¯ã¢ããããŒãã«ïŒåäžã®æ¡ä»¶ä»ãåãŸãã¯æååããŒãæã€ãªããžã§ã¯ãïŒãå¿
èŠãšããªãããšã§ãã ãã®ææ³ã¯ãã¿ã€ãã¬ãã«ã®ãžã§ããªãã¯é¢æ°ã®ã¢ããªã±ãŒã·ã§ã³ããšã³ã³ãŒãããããã«ã䜿çšã§ããŸãïŒ ReturnType<<T>(value: T) => Array<T>>
èããŠãã ããïŒã
ããã¯ãŸã æŠå¿µå®èšŒã§ããããããã®ã¢ãããŒãã®å®è¡å¯èœæ§ã«é¢ãããã£ãŒãããã¯ã¯å€§æè¿ã§ãïŒ
ç§ã¯ãã®@straxãèŠãŠã¿ãŸããããã¯æ¬åœã«ã¯ãŒã«ã«èŠããŸãïŒ
äžæ¹ããããç§ãã¡ãä»ã§ããããšã®ã°ãããäŸã§ãïŒ
type Test1 = λ<Not, [True]>; // False
type Test2 = λ<And, [True, False]>; // False
type Test3 = λ<And, [True, True]>; // True
// Boolean
interface True extends Func {
expression: Var<this, 0>;
}
interface False extends Func {
expression: Var<this, 1>;
}
interface Not extends Func {
expression: λ<Var<this, 0>, [False, True]>
}
interface And extends Func {
expression: λ<Var<this, 0>, [Var<this, 1>, Var<this, 0>]>
}
// Plumbing
type Func = {
variables: Func[];
expression: unknown;
}
type Var<F extends Func, X extends number> = F["variables"][X];
type λ<Exp extends Func, Vars extends unknown[]> = (Exp & {
variables: Vars;
})["expression"];
De Bruijnã€ã³ããã¯ã¹ãè¿œå ãããã®ã¯ãããã¯ã€ã³ã¿ãŒãã§ã€ã¹ãããå¿ èŠãªãããšãæå³ããããã§ãããã¿ãã«èšç®ãå¿ èŠã«ãªããšæããŸãããããé¿ããããšããŠããŸãã
ç°¡åã«èšãã°ãåç §åãŸãã¯é«éåã䜿çšãããšãåã«ãã£ãŠååŸããããã©ã¡ãŒã¿ãŒãåŸã§å»¶æããããåãã©ã¡ãŒã¿ãŒïŒãžã§ããªãã¯ïŒãåŸã§æšæž¬ãããããããšãã§ããŸãã ãããããªãç§ãã¡ã¯æ°ã«ããå¿ èŠããããŸããïŒ
åãåç §ãšããŠæž¡ãããšãã§ããå Žåãããã¯ãTypeScriptãåãè©äŸ¡ããããšã決å®ãããŸã§é ãããããšãã§ããããšãæå³ããŸãã å®éã®äŸãèŠãŠã¿ãŸãããã
pipe
ãžã§ããªãã¯åãéçºããŠãããšæ³åããŠãã ããã ã»ãšãã©ã®äœæ¥ã¯ããã€ããããé¢æ°ãå®éã«ãã€ãå¯èœã§ããããšã確èªããããšã§ããããã§ãªãå ŽåããŠãŒã¶ãŒã«ãšã©ãŒãçºçããŸãã ãã®ããã«ã¯ãããããããåã䜿çšããŠã pipe(...)
ããã«é¢æ°ã®åããã€ãããŸãã
type PipeSync<Fns extends Function[], K extends keyof Fns> =
K extends '0'
// If it's the first function, we leave it unchanged
? Fns[K]
// For all the other functions, we link input<-output
: (arg: Return<Fns[Pos<Prev<IterationOf<K & string>>>]>) =>
Return<Fns[Pos<IterationOf<K & string>>]>;
ããã§ãããããããåã®é¢æ°ã«å¯ŸããŠãããç¹°ãè¿ãå¿ èŠããããŸãã
type Piper<Fns extends Function[]> = {
[K in keyof Fns]: PipeSync<Fns, K>
}
ïŒå®å šãªå®è£ ãåç §ããŠãã ããïŒ
ããã§ãé¢æ°ããã€ãã§ã€ãªãããšãã§ããTypeScriptã¯èŠåãåºãããšãã§ããŸãã
declare function pipe<Fns extends F.Function[]>(...args: F.Piper<Fns>): F.Pipe<Fns>
const piped = pipe(
(name: string, age: number) => ({name, age}),
(info: {name: string, age: number}) => `Welcome, ${info.name}`,
(message: object) => false, // /!\ ERROR
)
ã§ããŸãïŒ é©åãªãšã©ãŒãçºçããŸããïŒ
ã¿ã€ã 'ïŒã¡ãã»ãŒãžïŒãªããžã§ã¯ãïŒ=>ããŒã«å€'ã®åŒæ°ã¯ãã¿ã€ã 'ïŒåŒæ°ïŒæååïŒ=>ããŒã«å€'ã®ãã©ã¡ãŒã¿ã«å²ãåœãŠãããšãã§ããŸããã
ãããåé¡ãããã ããã¯åçŽãªæäœã§ã¯éåžžã«ããŸãæ©èœããŸãããæž¡ããé¢æ°ã§ãžã§ããªãã¯ïŒãã³ãã¬ãŒãïŒã䜿ãå§ãããšå®å šã«å€±æããããšãããããŸãã
const piped = pipe(
(a: string) => a,
<B>(b: B) => b, // any
<C>(c: C) => c, // any
)
type piped = Piper<[
(a: string) => string,
<B>(b: B) => B,
<C>(c: C) => C,
]>
// [
// (a: string) => string,
// (b: string) => unknown,
// (c: unknown) => unknown
// ]
ã©ã¡ãã®å ŽåããTypeScriptã¯é¢æ°ã¿ã€ãã远跡ã§ããŸããã§ããã
>ããã§é«æ¬¡ã¿ã€ããç»å ŽããŸã<
type PipeSync<Fns extends Function[], K extends keyof Fns> =
K extends '0'
// If it's the first function, we leave it unchanged
+ ? *(Fns[K]) // this will preserve the generics
// For all the other functions, we link input<-output
+ : *( // <- Any type can be made a reference
+ <T>(arg: T) => Return<*(Fns[Pos<IterationOf<K & string>>])>
+ // vvv It is now a reference, we can assign generics
+ )<Return<*(Fns[Pos<Prev<IterationOf<K & string>>>])>>
+ // ^^^ We also tell TS not to evaluate the previous return
+ // and this could be achieved by making it a reference too
ã€ãŸãã *
ãŠãžã§ããªãã¯ãæåããã³åçã«æšæž¬ããŸããã å®éã *
ã䜿çšãããšããžã§ããªãã¯ã®è©äŸ¡ã延æãããŸããã ãããã£ãŠã *
åäœã¯ãã³ã³ããã¹ãã«å¿ããŠç°ãªããŸãã *
ã次ã®ã¿ã€ãã®å ŽåïŒ
T
å²ãåœãŠãããReturn<*(Fns[Pos<Prev<IterationOf<K & string>>>])>
ã§äžèšã§çºçããããšãšãŸã£ããåãã§ãã ãã®æèã§ã¯ã *
å³æã®è©äŸ¡ãããä¿è·ãããŠãããšèšããŸããtype piped = Piper<[
(a: string) => string,
<B>(b: B) => B
<C>(c: C) => C
]>
// [
// (a: string) => string,
// (b: string) => string,
// (c: string) => string
// ]
ãããã£ãŠãTypeScriptã¯ããžã§ããªãã¯ãæäŸãããŠããå Žåã«ã®ã¿è©äŸ¡ãéå§/ç¶ç¶ããå¿
èŠã«å¿ããŠè©äŸ¡ããããã¯ããå¿
èŠããããŸãïŒäžå®å
šãªãžã§ããªãã¯ïŒã çŸæç¹ã§ã¯ãTSã¯ãžã§ããªãã¯ãunknown
ã¿ã€ãã«å€æããããšã«ãããã¯ã³ã·ã§ããã§è©äŸ¡ããŸãã ãã®ææ¡ã§ã¯ãäœãã解決ã§ããªãå ŽåïŒ
type piped = Piper<[
<A>(a: A) => A, // ?
<B>(b: B) => B, // ?
<C>(c: C) => C, // ?
]>
// [
// <A>(a: A) => A,
// (b: A) => A,
// (c: A) => A
// ]
*
ã¯åãžã®åç
§ãååŸãããã®ãžã§ããªãã¯ã¹ã®æäœãå¯èœã«ããŸãã ãããã£ãŠãåã®åã«ã¯ã€ã«ãã«ãŒããé
眮ãããšããã®åãžã®åç
§ãååŸãããŸãã
*[type]
åãžã®åç §ãååŸãããšããžã§ããªãã¯ã¹ã®æäœãèªåçã«æå¹ã«ãªããŸãã
*[type]<T0, T1, T2...>
ãžã§ããªãã¯ã¯ãå¯èœã§ããã°ãã¿ãŒã²ããã¿ã€ãã«ãã£ãŠã®ã¿æ¶è²»/èšå®ãããŸãã ã ãããããè¡ãïŒ
*string<object, null> // Will resolve to `string`
ãã ããèŠåã衚瀺ãããã©ããã¯ãTypeScriptèªäœã§ç¢ºèªããããšãã§ããŸãã ããããå éšçã«ã¯ãTSã¯ããããäœãããã¹ãã§ã¯ãããŸããã
ãŸãã *
ã䜿çšããã®ã¯è¯ãèãã ãšæããŸãããããã¯ãïŒC / C ++èšèªã®ããã«ïŒäœããžã®ãã€ã³ã¿ãŒã象城ã§ããTypeScriptã«åçšãããŠããªãããã§ãã
æãåºæ¬çãªåœ¢åŒã§ã©ã®ããã«æ©èœããããèŠãŠããã®ã§ãã³ã¢ã³ã³ã»ããã§ããã©ã ãã¿ã€ãã玹ä»ãJavaScriptã®ã³ãŒã«ããã¯ãã©ã ããåç §ãšåæ§ã«ãå¿ååã䜿çšã§ãããšäŸ¿å©ã§ãã
äžèšã®äŸã¯ãé¢æ°ã®ãžã§ããªãã¯ãåŒãç¶ãæ¹æ³ã瀺ããŠããŸãã ãã ããåç
§ã«ã€ããŠè©±ããŠããã®ã§ãä»»æã®ã¿ã€ãã*
ãšçµã¿åãããŠäœ¿çšââã§ããŸãã ç°¡åã«èšãã°ãååç
§ã¯ãæž¡ãããšãã§ãããããžã§ããªãã¯ããŸã åãåã£ãŠããªãåã§ãã
type A<T extends string> = {0: T}
type B<T extends string> = [T]
type C<T extends number> = 42
// Here's our lamda
type Referer<*Ref<T extends string>, T extends string> = Ref<T>
// Notice that `T` & `T` are not in conflict
// Because they're bound to their own scopes
type testA = Referer<A, 'hi'> // {0: 'hi'}
type testB = Referer<B, 'hi'> // ['hi']
type testC = Referer<C, 'hi'> // ERROR
interface Monad<*T<X extends any>> {
map<A, B>(f: (a: A) => B): T<A> => T<B>;
lift<A>(a: A): T<A>;
join<A>(tta: T<T<A>>): T<A>;
}
@ pirix-ghã»ãã®å°ãã®ã¡ãã»ãŒãžãèªããšãããªããæ±ããŠããããšã®å€ãããã§ã«å¯èœã§ãããããã§ã«æ±ããããŠããããšãããããŸãã
ç§ã¯ããããèªã¿ãŸãããä»ã®äººãšåãããã«ïŒãªãŒã«ã€ã³ã¯ã³ãœãªã¥ãŒã·ã§ã³ã®å ŽåïŒãäž»ã«æ§æã«ã€ããŠèªåã®ã¢ã€ãã¢ãèŠçŽã§ãããšæããŸããã
åç
§ããã§ãŒã³ããæ¹æ³ããããã説æããããã«äžèšã®ææ¡ãç·šéãã Pipe
ãããªã¿ã€ãããããåŠçããæ¹æ³ãä¿®æ£ããŸããïŒããžãã¯ã«é¢ããŠããã€ãã®ééãããããŸããïŒã
ãã¹ãŠã®ã¢ããããŒãïŒ
ãŸã æŽæ°ã¯ãããŸãããïŒ ç§ã®æèŠã§ã¯ããã®åé¡ã¯TypeScriptããã®æœåšèœåãæ倧éã«çºæ®ããäžã§ã®æ倧ã®é害ãšããŠã©ã³ã¯ä»ããããŠããŸãã ã©ã€ãã©ãªãæ£ããå ¥åããããšãããšãé·ãèŠåŽã®æ«ã«è«Šãããã®å¶éã«åã³çŽé¢ããããšã«æ°ä»ãããšããããããŸãã ããã¯æ®åããŠãããäžèŠéåžžã«åçŽãªã·ããªãªã§ãçŸããŸãã ããã«å¯ŸåŠãããããšãæ¬åœã«æãã§ããŸãã
interface Monad<T<X>> {
map1<A, B>(f: (a: A) => B): (something: A) => B;
map<A, B>(f: (a: A) => B): (something: T<A>) => T<B>;
lift<A>(a: A): T<A>;
join<A>(tta: T<T<A>>): T<A>;
}
type sn = (tmp: string) => number
function MONAD(m: Monad<Set>,f:sn) {
var w = m.map1(f); // (method) Monad<Set>.map1<string, number>(f: (a: string) => number): (something: string) => number
var w2 = m.map(f); // (method) Monad<Set>.map<string, number>(f: (a: string) => number): (something: Set<string>) => Set<number>
var q = m.lift(1); // (method) Monad<Set>.lift<number>(a: number): Set<number>
var a = new Set<Set<number>>();
var w = m.join(q); // (method) Monad<Set>.join<unknown>(tta: Set<Set<unknown>>): Set<unknown>. You could see that typeParameter infer does not work for now.
var w1 = m.join<number>(q); // (method) Monad<Set>.join<number>(tta: Set<Set<number>>): Set<number>
}
quickinfoã®ä¿®æ£ãtypeParameterã®æšæž¬ããšã©ãŒã¡ãã»ãŒãžã®è¿œå ãåãtypeConstructorã®åŒ·èª¿è¡šç€ºãªã©ããŸã å€ãã®äœæ¥ãè¡ãå¿
èŠããããŸãã
ããããããã¯æ©èœãå§ããŸãããããŠãããç§ãä»ã®ãšããåŸãããšãã§ãããã®ã§ãã
ã€ã³ã¿ãŒãã§ãŒã¹ã®äŸã¯@millsphttps ïŒ //github.com/microsoft/TypeScript/issues/1213#issuecomment -523245130ããã®ãã®ã§ãããçµè«ã¯æ¬åœã«åœ¹ã«ç«ã¡ãŸãããã®ãããã§çŽ æŽãããã§ãã
çŸåšã®æ¹æ³ãã»ãšãã©ã®ç¶æ³ã§æ©èœãããã©ããã確èªããããã«ãã³ãã¥ããã£ããã®ãããªãŠãŒã¶ãŒã±ãŒã¹ãããã«æäŸã§ããããšãé¡ã£ãŠããŸãã
ãŸããHKT /é¢æ°åããã°ã©ãã³ã°/ã©ã ãã«é¢ããæ
å ±ãæäŸããã®ãããã§ãããïŒ lambda
ãšèšããšãæ°åŠãæå³ããŸããæ°åŠã䜿ããã«ãããèšèªã§æžãããäŸããèŠã€ãããŸããã§ããïŒ
ãããç§ã倧ãã«å©ãããã®ã§ãïŒ
@ShuiRuTian m.join(q)
Set<unknown>
m.join(q)
è¿ãããšã«é¢ããŠã --noImplicitAny
ãèŠåãçºããåå ã«ãªããšæããŸããïŒ
çŸåšã®æ¹æ³ãã»ãšãã©ã®ç¶æ³ã§æ©èœãããã©ããã確èªããããã«ãã³ãã¥ããã£ããã®ãããªãŠãŒã¶ãŒã±ãŒã¹ãããã«æäŸã§ããããšãé¡ã£ãŠããŸãã
ãŸããHKT /é¢æ°åããã°ã©ãã³ã°/ã©ã ãã«é¢ããæ å ±ãæäŸããã®ãããã§ãããïŒ
lambda
ãšèšããšãæ°åŠãæå³ããŸããæ°åŠã䜿ããã«ãããèšèªã§æžãããäŸããèŠã€ãããŸããã§ããïŒ
ãã以äžå
ã«é²ãŸããæè¿ãäžè¬çãªã«ã¬ãŒfilter
é¢æ°ãäœæããããšããŸãããã次ã®ãããªããšãããããšæããŸããã
const filterNumbers = filter(
(item: number | string): item is number => typeof item === "number"
);
const array = ["foo", 1, 2, "bar"]; // (number | string)[]
const customObject = new CustomObject(); // CustomObject<number | string>
filterNumbers(array); // number[] inferred
filterNumbers(customObjectWithFilterFunction); // CustomObject<number> inferred
ãããŠãå®éã«ãããè¡ãæ¹æ³ã¯ãããŸãããTypeScriptã«ãåãåã£ãã®ãšåãåãè¿ããããã®ä»ã®ãã©ã¡ãŒã¿ãŒã䜿çšãããããã«æ瀺ããæ¹æ³ãå¿ èŠã ããã§ãã ãã®ãããªãã®ïŒ
const filter = <Item, FilteredItem>(predicate: (item: Item) => item is FilteredItem) =>
<Filterable<~>>(source: Filterable<Item>): Filterable<FilteredItem> => source.filter(predicate);
@lukeshiruãããåºæ¬çã«ããã¯https://pursuit.purescript.org/packages/purescript-filterable/2.0.1/docs/Data.Filterable#vïŒfilterã§ãã
TypeScriptã®HKTã«ã¯ä»ã«ãåæ§ã®ãŠãŒã¹ã±ãŒã¹ããããããããŸãã
@isiahmeadowsè©ŠããŠã¿ãŸããã ããªããæ£ããã§ãã
@lukeshiruãš@raveclassicããããšãïŒ ãã®æ©èœã¯ããªãå
±é³ŽããŠããããã§ãã https://gcanti.github.io/fp-ts/learning-resources/ãèªãã åŸããããèŠãŠã¿
è¡ãè©°ãŸã£ãŠããŠãçŸåšã®âžåé¿çâœãäœã§ãããããããŸãã...
ç§ã¯ãã§ãŒã³ä»æ§ãå®è£
ããããšããŠããŸãïŒ
m['fantasy-land/chain'](f)
Chainä»æ§ãå®è£ ããå€ã¯ãApplyä»æ§ãå®è£ ããå¿ èŠããããŸãã
a['fantasy-land/ap'](b)
FunctorSimplex
ãå®è¡ãããããFunctorComplex
æ¡åŒµãã次ã«Apply
æ¡åŒµããŸãããã Apply
ãChain
ãšããŠæ¡åŒµããããšæããŸãã
ã ããç§ã¯ãããå¿ èŠã§ãïŒäžã®ç»åãšã³ãŒããžã®ãªã³ã¯ïŒïŒ
ïŒ12è¡ç®ã§
Apply
ããããŒãã³ãŒãããããŠããªããäžè¬çã§ããããã«ãã¿ã€ããApType
ã«æž¡ãå¿ èŠããããŸã...IApply
ããæ¡åŒµãããã¿ã€ããååŸããŸã
7ff8b9cã®ã³ãŒãã¹ãããã
`` `typescript
ãšã¯ã¹ããŒãã¿ã€ãApType = ïŒ apïŒé©çš<ïŒvalïŒAïŒ=> B>ã ïŒ=> IApply ;
/ * [...] * /
ãšã¯ã¹ããŒãã€ã³ã¿ãŒãã§ã€ã¹IApplyã¯FunctorComplexã{
/ ** Fantasy-land/ap :: Apply f => f a ~> f (a -> b) -> f b
* /
apïŒApType ;
}
`` `
ã¹ã¿ãã¯ãªãŒããŒãããŒã®è³ªåãžã®åç §ïŒ TypeScriptãžã§ããªãã¯ã¿ã€ãã®åé¡ïŒåé¿çãå¿ èŠ
@Luxcium TSãããé«çš®é¡ã®ã¿ã€ãããµããŒããããŸã§ã¯ããããã®ãšãã¥ã¬ãŒã·ã§ã³ã®ã¿ãå¯èœã§ãã ãããèŠãŠãã©ã®ããã«éæã§ãããã確èªããããšããå§ãããŸãã
TSãããé«çš®é¡ã®ã¿ã€ãããµããŒããããŸã§ã¯ããããã®ãšãã¥ã¬ãŒã·ã§ã³ã®ã¿ãå¯èœã§ãã ãããèŠãŠãã©ã®ããã«éæã§ãããã確èªããããšããå§ãããŸã
ã¿ã³ã¯ããããã@kapkeæè¿ã¯ããããFPã«ãJavascriptã§ã¯é¢æ°ããé¢æ°ãè¿ãããšãã§ããã®ã§ã pseudoFnAdd(15)(27) // 42
ãèšè¿°ã§ããŸããTypeScriptã䜿çšããŠpseudoType<someClassOrConstructor><number> // unknown
ãèšè¿°ã§ããããã«ããããšæããŸãã
ãã®æ å ±ãšè¬çŸ©ïŒæèªïŒã¯å€§æè¿ã§ã...
泚ïŒç§ã¯ãã©ã³ã¹èªã話ããŸãããã©ã³ã¹èªã§ã¯ã_lectureïŒsïŒ_ãšããåèªã¯_readings_ã®æå³ãæã¡ãã圌ãã®è¡åãæ¹å€ããããã«èª°ãã«äžããããæããçå£ãªè©±ãã§ã¯ãããŸãã...
ãããããPRãªãã®ç°¡åãªåé¿çãšããŠç§ãæãã€ããã®ã¯ããã¹ãŠã®å Žåã«æ©èœãããšã¯éããŸããããèšåãã䟡å€ããããšæããŸãã
type AGenericType<T> = T[];
type Placeholder = {'aUniqueKey': unknown};
type Replace<T, X, Y> = {
[k in keyof T]: T[k] extends X ? Y : T[k];
};
interface Monad<T> {
map<A, B>(f: (a: A) => B): (v: Replace<T, Placeholder, A>) => Replace<T, Placeholder, B>;
lift<A>(a: A): Replace<T, Placeholder, A>;
join<A>(tta: Replace<T, Placeholder, Replace<T, Placeholder, A>>): Replace<T, Placeholder, A>;
}
function MONAD(m: Monad<AGenericType<Placeholder>>, f: (s: string) => number) {
var a = m.map(f); // (v: string[]) => number[]
var b = m.lift(1); // number[]
var c = m.join([[2], [3]]); // number[]
}
æãåèã«ãªãã³ã¡ã³ã
HKTã®èãæ¹ãå€ããããšãã§ããç¿æ £ãå£ãã倱ãããäžä»£ãçãè¿ãããããšãã§ããŸãããžã§ããªãã¯ã¹ãšæ瀺çãªnullãšæªå®çŸ©ãªã®ã§ããã¹ãŠãå€ããããšãã§ããŸãã
ããã次ã®å€§ããªç¹åŸŽãšèããŠãã ãããããè¯ã銬ãæ±ãç¶ãã人ã ã«è³ãåŸããã®ããããŠã圌ãã«af * g ferrari