DEV Community ๐Ÿ‘ฉโ€๐Ÿ’ป๐Ÿ‘จโ€๐Ÿ’ป

SUZUKI Tetsuya
SUZUKI Tetsuya

Posted on

"type t" ใจใฏไฝ•ใ‹

โ€ปใ“ใฎ่จ˜ไบ‹ใฏ 2018ๅนด01ๆœˆ12ๆ—ฅ ใซ Qiita ใซๆŠ•็จฟใ—ใŸใ‚‚ใฎใงใ™ใ€‚

โ€ปReason ๅ‘ใ‘ใฎๅ†…ๅฎนใงใ™ใŒใ€ OCaml ใจใ‚‚ๅ…ฑ้€šใ—ใพใ™ใ€‚


Reason ใงๆ›ธใ‹ใ‚ŒใŸใ‚ณใƒผใƒ‰ใ‚’่ฆ‹ใฆใ„ใ‚‹ใจใ€ใจใ“ใ‚ใฉใ“ใ‚ใง type t ใจใ„ใ†ไธ€ๆ–‡ๅญ—ใฎๅž‹ๅใ‚’็›ฎใซใ—ใพใ™ใ€‚ไพ‹ใˆใฐใ“ใ†ใ„ใ†ใฎ:

module Synthetic = {
  type tag;
  type t = synthetic(tag);
  ...
}

ใ“ใ‚Œใฏ 1ใƒขใ‚ธใƒฅใƒผใƒซ1ใƒ‡ใƒผใ‚ฟๅž‹ไธป็พฉ ใจใ„ใ† OCaml ใฎไธ€ๆ…ฃ็ฟ’ใ‹ใ‚‰ๆฅใฆใ„ใพใ™๏ผˆใ„ใ‚‹ใจๆ€ใ‚ใ‚Œใพใ™๏ผ‰ใ€‚

Reason ใฎใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใซใƒฌใ‚ณใƒผใƒ‰ๅฎš็พฉใฎไธ€ไพ‹ใŒใ‚ใ‚Šใพใ™ใ€‚

type person = {age: int, name: string};
type monster = {age: int, hasTentacles: bool};

ใฉใกใ‚‰ใฎใƒฌใ‚ณใƒผใƒ‰ใ‚‚ age ใจใ„ใ†ๅŒๅใฎใƒ•ใ‚ฃใƒผใƒซใƒ‰ใ‚’ๆŒใกใพใ™ใ€‚ Reason ใฎใƒฌใ‚ณใƒผใƒ‰ใฏๅๅ‰็ฉบ้–“ใŒ็‹ฌ็ซ‹ใ—ใฆใŠใ‚‰ใšๅ…ฑๆœ‰ใ•ใ‚Œใ‚‹ใŸใ‚ใ€ๅž‹ๆŽจ่ซ–ๆ™‚ใฎ person ใจ monster ใฎๅŒบๅˆฅใฏใƒ•ใ‚ฃใƒผใƒซใƒ‰ๅใฎ็ต„ใฟๅˆใ‚ใ›ใงๅˆคๆ–ญใ•ใ‚Œใพใ™ใ€‚ใƒฌใ‚ณใƒผใƒ‰ใฎ็”Ÿๆˆๆ™‚ใซ name ใƒ•ใ‚ฃใƒผใƒซใƒ‰ใŒใ‚ใ‚Œใฐ person ๅž‹ใ€ hasTentacles ใƒ•ใ‚ฃใƒผใƒซใƒ‰ใŒใ‚ใ‚Œใฐ monster ๅž‹ใจๅˆคๆ–ญใ•ใ‚Œใพใ™๏ผˆใ‚‚ใกใ‚ใ‚“ๆ˜Ž็คบ็š„ใซใƒฌใ‚ณใƒผใƒ‰ๅž‹ใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใ“ใจใ‚‚ใงใใพใ™๏ผ‰ใ€‚

/* person */
let me = {age:100, name:"me"};

/* monster */
let me = {age:100, hasTentacles:true};

ใงใฏใ€ใพใฃใŸใๅŒใ˜ใƒ•ใ‚ฃใƒผใƒซใƒ‰ใ‚’ๆŒใคใƒฌใ‚ณใƒผใƒ‰ๅž‹ใŒใ‚ใฃใŸใ‚‰ใฉใ†ใงใ—ใ‚‡ใ†ใ‹ใ€‚

type person = {age:int, name:string};
type monster = {age:int, name:string};

/* ใฉใฃใกใฎใƒฌใ‚ณใƒผใƒ‰๏ผŸ */
let me = {age:100, name:"me"};

็‰นใซๅž‹ใฎๆŒ‡ๅฎšใŒใชใ‘ใ‚Œใฐใ€ใƒ•ใ‚ฃใƒผใƒซใƒ‰ๅใงใฏๅž‹ใ‚’ๅˆคๆ–ญใงใใพใ›ใ‚“ใ€‚ใ“ใฎใ‚ˆใ†ใชๅ ดๅˆใ€ Reason ใงใฏๆœ€ๅพŒใซๅฎš็พฉใ•ใ‚ŒใŸๅž‹ใจใ•ใ‚Œใพใ™ใ€‚ me ใฏ monster ๅž‹ใงใ™ใ€‚

ใงใ™ใฎใงใ€ๆฌกใฎใ‚ˆใ†ใซ person ใ‚’ๅผ•ๆ•ฐใซๅ—ใ‘ๅ–ใ‚‹้–ขๆ•ฐใซ me ใ‚’ๆธกใ™ใจๅž‹ใ‚จใƒฉใƒผใซใชใ‚Šใพใ™ใ€‚

let me = {age: 100, name: "me"};

/* person ๅž‹ใฎๅผ•ๆ•ฐใ‚’ๅ–ใ‚‹ใ ใ‘ใงไฝ•ใ‚‚ใ—ใชใ„้–ขๆ•ฐ */
let f = (who: person) => ();

f(me);

ใ‚ณใƒณใƒ‘ใ‚คใƒซใ‚จใƒฉใƒผ:

  13 โ”‚ let f = (who: person) => ();
  14 โ”‚ 
  15 โ”‚ f(me);

  This has type:
    monster
  But somewhere wanted:
    person  

me ใฏ monster ๅž‹ใ ใจๅˆคๆ–ญใ•ใ‚Œใพใ—ใŸใ€‚ใ“ใฎๅ ดๅˆใฏ me ใฎๅž‹ใ‚’ person ใจๆ˜Ž็คบ็š„ใซๆŒ‡ๅฎšใ™ใ‚Œใฐๅคงไธˆๅคซใงใ™ใ€‚

let me: person = {age: 100, name: "me"};

OCaml ใ ใจใƒ•ใ‚ฃใƒผใƒซใƒ‰ๅใŒ้‡่ค‡ใ™ใ‚Œใฐใ‚ณใƒณใƒ‘ใ‚คใƒซๆ™‚ใซ่ญฆๅ‘Šใ•ใ‚Œใพใ™ใ€‚ Reason ใฎๅ”ฏไธ€ใฎๅทฅๅคซใฎใ‚ˆใ†ใซ่ฆ‹ใˆใพใ™ใŒใ€ใ‹ใˆใฃใฆ่ฝใจใ—็ฉดใŒใงใใฆใ—ใพใฃใŸๆฐ—ใ‚‚ใ—ใพใ™ใ€‚

ใŸใ ใ—ใ€ๆ—ขๅญ˜ใฎใƒฌใ‚ณใƒผใƒ‰ใจใƒ•ใ‚ฃใƒผใƒซใƒ‰ๅใŒ้‡่ค‡ใ—ใฆใ„ใ‚‹ใจ่ญฆๅ‘Š 42 ใงๆณจๆ„ใ•ใ‚Œใพใ™ใ€‚ (ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใฎ่ญฆๅ‘Šใฎ่จญๅฎšใงใฏ็„กๅŠนใงใ™)

   9 โ”‚ };
  10 โ”‚ 
  11 โ”‚ let me:person = {age: 100, name: "me"}; // ``age`` ใฎ้ƒจๅˆ†ใŒใƒใ‚คใƒฉใ‚คใƒˆใ•ใ‚Œใ‚‹
  12 โ”‚ 
  13 โ”‚ let f = (who: person) => ();

  this use of age required disambiguation

ใ“ใ“ใงๅ…ƒใฎๅ•้กŒใซๆˆปใ‚Šใพใ™ใ€‚ไปฅไธŠใฎ้€šใ‚Šใƒฌใ‚ณใƒผใƒ‰ใฏๅๅ‰็ฉบ้–“ใซใชใ‚‰ใชใ„ใฎใงใ€ใƒ•ใ‚ฃใƒผใƒซใƒ‰ๅใŒ้‡่ค‡ใ™ใ‚‹่ค‡ๆ•ฐใฎใƒฌใ‚ณใƒผใƒ‰ใ‚’ๅฎš็พฉใ™ใ‚‹ๅ ดๅˆใฏใ€ใƒ•ใ‚ฃใƒผใƒซใƒ‰ๅใซ้ฉๅฝ“ใชๆŽฅ้ ญ่พžใ‚’ใคใ‘ใ‚Œใฐๅ•้กŒใฏๅ›ž้ฟใงใใพใ™ใ€‚ใงใ‚‚ person_age ใ‚„ monster_age ใจใ„ใกใ„ใกใ‚„ใ‚‹ใฎใฏใ‚ใพใ‚Šใ‹ใฃใ“ใ‚ˆใ‚ใ—ใใชใ„ใ€‚ใ ใ‹ใ‚‰ใใ‚Œใžใ‚Œใฎใƒฌใ‚ณใƒผใƒ‰ๅž‹ใซๅฐ‚็”จใฎใƒขใ‚ธใƒฅใƒผใƒซใ‚’็”จๆ„ใ™ใ‚Œใฐใƒ•ใ‚ฃใƒผใƒซใƒ‰ๅใฎ้‡่ค‡ใ‚’ๆฐ—ใซใ‹ใ‘ใชใใฆใ„ใ„:

module Person = {
  type t = {
    age: int,
    name: string
  };
};

module Monster = {
  type t = {
    age: int,
    name: string
  };
};

ใ“ใฎใจใใซไฝฟใ†ๅž‹ๅใŒ t ใงใ™๏ผˆ"type" ใฎ "t" ใ‹ใช๏ผŸ๏ผ‰ใ€‚ใ‹ใคใฆใฎใƒฌใ‚ณใƒผใƒ‰ person ใจ monster ใฏใใ‚Œใžใ‚Œ Person.t ใจ Monster.t ใจใ—ใฆๅฎš็พฉใ•ใ‚Œใพใ™ใ€‚ t ใจใคใๅž‹ใฏใ€ใใฎใƒขใ‚ธใƒฅใƒผใƒซใฎไธญๅฟƒ็š„ใชใƒ‡ใƒผใ‚ฟๅž‹ใ ใจใ‚ใ‹ใ‚Šใพใ™ใ€‚ใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚นใƒ•ใ‚กใ‚คใƒซใงใ‚ใ‚‹ .rei ใจ t ใ‚’ๆŽขใ›ใฐใ€ API ใฎใ ใ„ใŸใ„ใฎๆ„ๅ‘ณใŒๆŽจๆธฌใงใใพใ™ใ€‚

ไปฅไธŠใงใ™ใ€‚ Reason ใฏ OCaml ใ‚’ไธธใ”ใจๆ–ฐใ—ใ„ๆ–‡ๆณ•ใง่ฆ†ใฃใŸใ ใ‘ใชใฎใงใ€ OCaml ใฎไธไพฟใช็‚นใ‚‚ใ€ไธไพฟใ‚’่งฃๆถˆใ™ใ‚‹ใŸใ‚ใฎใ‚คใƒ‡ใ‚ฃใ‚ชใƒ ใ‚‚ใใฎใพใพๅผ•ใใšใฃใฆใ„ใพใ™ใ€‚ๆ”นๅ–„ใ™ในใ็‚นใฏๆ–‡ๆณ•ไปฅๅค–ใซใ‚‚ใ‚ใ‚‹ใ‚“ใ˜ใ‚ƒใชใ„ใงใ™ใ‹ใญ...

Top comments (0)

๐ŸŒš Life is too short to browse without dark mode