プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • 関数型言語
  • 【関数型言語】「計算モデル」の種類、カリー化
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【関数型言語】「計算モデル」の種類、カリー化

08.29

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

機械が保持している計算モデルは3つのモデルがあります。

命令型モデル

アランチューリングが考案した。JavaやCなどで採用される一般的なモデル、「計算」とは「命令を実行する」こと。

命令

計算機の状態を変更する処理のこと。例をあげれば電卓などの仕組みです。1を押したら1が表示され、+と2を押したら3が表示されます。

メリット

概念は現実世界と似ているのでわかりやすい。

デメリット

状態が分かりづらい。プログラムが必要以上に複雑になる。

チューリング機械

1930年代にアランチューリングが機械によって計算を自動化しました。

なぜ流行ったのか?

ハードウェアの構造に近かったため。関数型モデルではメモリやコンパイルの効率的な管理がしにくい。

関数型モデル

HaskellやLispなどで採用される。「計算」とは「関数を呼び出して値を得る」こと。

ラムダ計算

アメリカのアロンゾ・チャーチが考案した。関数名がない。関数から名前を取り除いた抽象関数である。

バインドする

以下のように変数に関数を対応づけることを「バインドする」と言います。

1
2
3
const a = (x)=> {
return x+1;
};

a()とすることで関数を呼び出せます。

なぜ注目されつつあるのか?

メモリやCPUの処理能力向上によりメモリ管理などの実装上の問題は解決されやすくなっているため。

命令型モデルに比べて簡潔に記述ができる。

置換ルール

我々が小学校の頃にやってきた計算手順と同じもの。

「関数適用の時に引数の値で関数本体の内部の変数を置換する」という規則があります。ということは、逆に言えば、「関数呼び出しの結果は、その関数の引数のみに依存する」ことになる。

計算の過程(状態)が捉えやすい。

計算の状態を明示できる。

関数として扱う姿勢

処理自体を部品化できるようになる。

論理型モデル

Prologなどで採用される。「計算」とは「証明を得る」こと。現在はあまり使われません。

カリー化された関数とは?

  • カリー化された関数はただ一つの引数しか取らない。
  • 1つの引数しか取らない別の関数を返す。
  • 高階関数の一種

カリー化のメリット

ただ一つしか引数を取らないので、関数同士を組み合わせる場面で引数の数を一致させる必要がなく関数に汎用性を持たせることができる。

カリー化された関数の例

1
2
3
4
5
const a = (x) => {
  return (y) => {
    return x + y;
  }
}

なので、a(1)などと指定しても無名関数が返ってくるだけです。a(1)(2)などとしたら初めて3という計算結果が返ってきます。

スポンサーリンク
  • 2021 08.29
  • miyabisan2
  • コメントを書く
  • 関数型言語
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2021 09.03

    【関数型言語】「参照透過性」を破壊するものと対策

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【プログラミング】「副作用」、フロントエンド開発でイミ…

【関数型言語】「参照透過性」を破壊するものと対策

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー