現実の世界で「強力な」型システムを使用しているのは、たとえば大規模なWebアプリの場合ですか?


29

これは非常に広く、曖昧で、おそらく哲学的な質問であることを知っています。質問の中で最も重要なキーワードである「強力な」タイプのシステム自体は、ある程度不明確です。だから、私が意味することを説明しようとさせてください。

質問の全体的なコンテキスト

私たちはRuby on Railsで非常に大規模なWebアプリを構築してきましたが、私たちは一般的にスタックに満足しています。必要に応じて、ものを非常に高速に出荷できます-約10%のエッジケースをあまり心配することなく、「ビジネス」ケースの90%で機能するものです。一方、コードレビューとテストカバレッジの助けを借りて、ゆっくりと慎重になり、すべてのベースをカバーするようにすることができます-再び、そのような綿密な調査と安全に値する状況でのみ。

しかし、チームが成長するにつれて、スタックに焼き付けられた「セーフティネット」の欠如に不快感を覚え始めました。

最近、JavaでAndroidのネイティブ開発を開始しました。そして、私はコンパイルされた/静的な/強く型付けされた言語によって提供される安全性を(心地よく)思い出しました。

  • 変数のつづりが間違っている、データ型が間違っている、関数の呼び出しが正しくない、些細なエラーがIDE自体でキャッチされます。IDEがコンパイラにフックして、プログラムの「正確性」の特定の側面を検証できるためです。
  • 関数シグネチャを変更する必要がありますか?簡単です。コンパイラ+ IDEは、すべての呼び出しサイトを見つけるのに役立ちます。
  • 特定の例外が常に処理されるようにする必要がありますか?あなたの救助のチェックされた例外。

現在、これらの安全機能には利点がありますが、それらの欠点もよく知っています。さらに、「ボイラープレートヘビー」Javaの世界では。したがって、Javaの代わりに、私は人々が最近作業を開始した多数の現代の「強く型付けされた」言語を見始めました。例:Scala、Rust、Haskellなど。私が最も興味を持っているのは、型システムと静的/コンパイル時チェックの力です。

さて、質問

これらの強力な型システムと静的/コンパイル時機能を大規模なアプリケーションで使用するにはどうすればよいですか?

たとえば、これらの強力な機能の標準的な「hello world」のような紹介を超えてどのように移行するのでしょうか リッチタイプシステムを使用してビジネスドメインの問題をモデル化するものはありますか?タイプシステムは、30,000 LOC +ゾーンにいるときに役立ちますか、それとも妨げになりますか?システムが弱く型付けされた外の世界と対話するとき、これらの型システムによって提供されるセーフティネット(およびコンパイル時チェック)に何が起こるか。JSONまたはXML API、さまざまなデータストア、ユーザー入力などを介して


12
本当の答えがないので、これはトピックから外れています。この質問は、事実に基づいた説明ではなく、意見を述べる議論(「静的型が好き/嫌い...」)を引き起こすことを目的としています。私のアドバイスは、「システムが弱く型付けされた外の世界と対話するとき、これらの型システムによって提供されるセーフティネットはどうなりますか」など、質問のより具体的な部分の1つを選ぶことです。それについての質問書き直してください。そうすれば将来の読者に役立つ決定的な答えが得られます。
ベンジャミンホジソン

5
リソースに関する推奨事項もここではオフトピックです(そのような回答はすぐに時代遅れになり、Googleはそれよりも優れているからです)。ベンジャミンが言ったように、あなたの投稿には答えられる質問がいくつかありますが、現在の状態の投稿全体は基本的に人々にこれらの言語を使用して彼らの経験を説明するよう求めています。これはStackExchangeよりもQuoraまたはRedditにはるかに適していますサイト。この質問はよく尋ねられるので、私は投票していませんが、StackExchangeの質問ではありません。
Ixrec

4
型システムはツールであり、他のツールと同様に、その有効性はツール自体ではなく使用者に大きく依存します。Haskellのような言語の型システムを活用して、ビジネスロジックに関する不変条件を型レベルでエンコードし、それらの不変条件をコンパイラーでマシン(コンパイラー)にチェックさせることができますが、これを行うには、セマンティクスの理解が必要です型システムと型チェック。正しい質問は、「これはWebに適したツールですか」ではなく、「ここに私が直面している特定の問題があります。どうすれば強力な型システムを使用してそれらに対処できますか?」
user2407038

5
説明するもののほとんどは、型システムとは関係ありません。これらは純粋にIDEの機能です。チェック例外の例外(しゃれはありません)を除き、言及したすべての機能は、静的に型付けされた言語のIDEに登場するずっと前からSmalltalk IDEに存在していました。実際、最も広く使用されているJava IDEの1つは、修正されたSmalltalk IDE(Javaコードを理解するために修正されたが、まだSmalltalkで記述され、その後Javaに移植されたVisualAge JavaとしてリリースされたIBM VisualAge Smalltalkそして...としてリリース
イェルクWミッターク

4
…VisualAge Java Micro Edition。その後、再利用可能なコンポーネントに分割され、Eclipseという名前でオープンソースとしてリリースされました。やや皮肉なことに、この質問の文脈で、それが正確であるため、 SmalltalkのIDEには非常に強力であることをSmalltalkのシステムの動的な性質の。たとえば、自動リファクタリングが発明され、Smalltalkで最初に実装されました。あなたのロジックでは、Haskellはあなたが言及したすべての言語の中で最も強力で厳密な静的型システムを持っているため、最高のIDEを持たなければなりません。しかし、そうではありません。「コンパイラーへのフック」についても言及しました。これは...持っている
イェルクWミッタークに

回答:


34

現時点では時間が足りないため、簡単な回答をしますが、現在2つの大きなプロジェクト(Haskellで> 100.000 LOC)に取り組んでいます-flowbox.ioluna-lang.org。バックエンド、プログラミング言語のコンパイラ、さらにはwebGLベースのGUIを含むすべての部分にHaskellを使用します。強い型システムと「依存型」のような機械があなたを導き、他の言語で知られている負担と手間からあなたを救うことができることを認めなければなりません。これらの型は非常に広範囲に使用されており、コンパイル時にチェックできるものはすべてそうなっています。実際、過去3年間の開発では、ランタイムエラーやスタックオーバーフローに遭遇することはありませんでした(これは本当に素晴らしいことです)。唯一のエラーは、プログラマーによる明らかな論理エラーです。多くの人々は、Haskellで何かがコンパイルされた場合、それが機能するだけで、いつかあなたの顔に吹き飛ばされないことを十分に確認すべきだと言います。

質問の最初の部分に答えます。次のような優れたブログを読んで、これらの強力なタイプシステム機能について学ぶことができます。

実際、他にもたくさんの素敵なブログがあります(惑星Haskellのような)。とにかく、高度な型システムを本当に理解する最良の方法は、有用なオープンソースライブラリを開発することです。(Flowbox&New Byte Orderで)私たちは多くのライブラリをリリースしています(Hackageで見つけることができます)。したがって、何を開発すべきかわからない場合は、いつでもプロジェクトに参加できます。 want(luna-lang.orgで利用可能なメール)。


4
「多くの人は、Haskellで何かがコンパイルされた場合、それが機能するので、いつかは顔に吹き飛ばさないことを確信すべきだと言っています。」:Haskellは、小さな(些細ではないけれど)プロジェクトにしか使用していません、しかし、私はこれを確認することができます:Haskellコンパイラーが満足されたら、バグが残っていることはほとんどありません。
ジョルジオ

1
私はおそらく型を最も嫌う「Haskell」の人の一人でしょう(結局、型なしでHaskellの自分のバージョンを書いたのです)-しかし、ほとんどの人はさまざまな理由でそうします。ソフトウェアエンジニアリングに関しては、GHCが満足しているときはプログラムが機能するという感覚があります。Haskellのような型システムは、プログラミングにおける人為的なミスを検出するだけでなく、巨大なコードベースを管理するための究極のツールです。(タイプerrosを修正しなければならないときはいつも、ジョヴァンニのミュウツーの鎧に対する正当化を常に覚えています。)
MaiaVictor

ガブリエル・ゴンザレスのブログは、最初に始めるのに最適です。
サムブーサリス

@ danilo2会社のウェブサイトのcontact @アドレスにメールを送信しました。応答するように要求します。ありがとう!
Saurabhナンダ

@SaurabhNanda:受信トレイを再確認しましたが、あなたからのメッセージは表示されません。<at> luna-lang.orgに連絡するために送信しましたか?wojciech <dot> danilo <at> gmail <dot> comに直接連絡してください。この問題の原因を調査します:)
danilo2

17

まあ、弱いタイピングと強いタイピングはかなり曖昧に定義されています。さらに、「強い型付け」の一般的な使用法に最も近いのは、型をキャストするのを困難にするものを参照することであるため、さらに強力な型システムを説明することはできません。30ポンド未満しか持てない場合は弱く、もっと持ち上げることができる人は誰でも同じカテゴリーの「強い」という誤解を招く区別になります。

だから私は定義を好む:

  • 弱く型付けされたシステムは型を使用して、特定のこと(ミスなど)を防ぐことができます
  • 強く型付けされたシステムは型を使用してあなたのために物事を行います

あなたのために何かをするということはどういう意味ですか?さて、Servantフレームワークでの画像変換APIの作成を調べてみましょう(Haskellでは、実際にそれを知る必要はありません。

{-# LANGUAGE
    TypeOperators,
    DataKinds
    #-}

import Codec.Picture
import Data.Proxy
import Network.Wai.Handler.Warp (run)
import Servant
import Servant.JuicyPixels

main :: IO ()
main = run 8001 conversion

これは、ServantパッケージやServantへのJuicyPixelsプラグインを含むいくつかのモジュールが必要であり、プログラムの主なエントリポイントは、Warpバックエンドを使用するサーバーとしてポート8001で「変換」機能を実行することです。言語ビットを無視します。

conversion :: Application
conversion = serve (Proxy :: Proxy ConversionApi) handler

これは、変換関数はAPIが「ConversionApi」タイプと一致する必要があるサーバーであり、要求は関数によって処理されることを意味しています handler

type ConversionApi
     = ReqBody '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] DynamicImage
    :> Post '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] DynamicImage

これはConvesionApiタイプを指定しています。リスト '[BMP、GIF、JPEG 50、PNG、TIFF、RADIANCE]で指定された着信コンテンツタイプを受け入れ、それらをDynamicImageとして処理し、同じ範囲のコンテンツに変換されたDynamicImageを返す必要があると述べています。タイプ。:>の意味を正確に心配する必要はありません。今のところ、それを幸せな魔法と考えてください。

したがって、私の好みの定義を考えると、弱く型付けされたシステムは次のようなことを保証できます:

  • 間違った発信コンテンツタイプを返さない
  • 着信リクエストを間違ったコンテンツタイプとして解析しない
  • サーバーがより複雑な場合、不正な形式のURIを作成できなくなりますが、リンクを含むHTMLページを実際に返すわけではありません(そして、このタイプはできないことを保証します!)
  • 非常に野心的な弱いタイピングシステムは、すべての着信および発信コンテンツタイプを徹底的に処理していることを確認し、タイプが単なる制約ではなく仕様文書としても機能することを確認することさえあります。

上記の定義を考慮すると、すべての高尚な目標ですが、実際には厳密に型指定されたシステムとしての資格を得るには十分ではありません。そして今、私たちは実際にこの仕様に従うコードを書くことの難しい部分に到達しなければなりません。非常に強力な型システムでは、次のように記述します。

handler = return

そして、これで完了です。それだけです、書くコードはもうありません。これは完全に機能するWebサーバーです(私が見逃したタイプミスを修正します)。型は、定義してインポートした型とパッケージ(技術的にはモジュール)からWebサーバーを作成するために必要なすべてをコンパイラーに伝えました。

それでは、主要なアプリケーション規模でこれを行う方法をどのように学びますか?まあ、それは小規模なアプリケーションでそれらを使用することと実際にはそれほど違いはありません。絶対型は、それらに関連するコードの量を気にしません。

実行時の型検査はおそらく避けるべきものです。なぜなら、型によって物事を単純化するのではなく、それによって莫大な利益が失われ、型を使ってプロジェクトをより複雑にすることができるからです。

そのため、ほとんどの場合、型を使用したモデリングの練習問題にすぎません。モノのモデリング(または一般的なビルド)の2つの主な方法は、ボトムアップとトップダウンです。トップダウンは、最高レベルの操作から始まり、モデルを構築するにつれて、後までモデリングを延期する部分があります。ボトムアップモデリングとは、基本機能で開始するのと同様に、基本操作で開始し、プロジェクトの操作を完全にキャプチャするまで、ますます大きなモデルを構築することを意味します。ボトムアップはより具体的であり、おそらくビルドがより高速ですが、トップダウンは、実際にどのように動作する必要があるかについて、下位レベルのモデルによりよく知らせることができます。

タイプは、プログラムが文字通り数学とどのように関係するかであるため、複雑さの上限や、それについて学習を「完了」できるポイントは実際にはありません。事実上、高レベルの大学コース以外のすべてのリソースは、特定の言語でのタイプの動作に専念しているため、同様に決定する必要があります。

私が提供できる限り、型は次のように階層化できます。

  • [] + {}が定義されているJavaScriptなどの非常に弱い型付け
  • [] + {}ができないPythonのように弱く型付けされていますが、試してみるまでチェックされません
  • [] + {}ができないCやJavaのような弱い型付けですが、コンパイル時にチェックされますが、より高度な型機能はありません
  • C ++テンプレートメタプログラミングなど、弱く強く型付けされた型と、型がプロパティを強制するだけの単純なHaskellコードとの境界をまたぐ。
  • 上に示したように、型が処理するより複雑なHaskellプログラムのように、完全に型付けされた完全に
  • AgdaやIdrisのように、型と値が相互作用し、互いに制約することができる非常に強く型付けされたもの。これは、型システムが得るのと同じくらい強力であり、それらでのプログラミングは、プログラムが何をするかについて数学的な証明を書くのと同じです。注:Agdaでのコーディングは、文字通り数学的証明を書いているのではなく、型は数学的理論であり、それらの型を持つ関数はそれらの理論を証明する建設的な例です。

一般的に、このリストの下方に行くほど、タイプができることは多くなりますが、最下部までには成層圏に登っており、空気が少し薄くなっています-パッケージのエコシステムははるかに小さく、あなたは関連するライブラリを見つけた場合と比べて、より多くのものを自分で記述する必要があります。また、大規模なプログラムを書くのに十分な型システムを実際に理解する必要があるため、エントリの障壁も低くなります。


リストに要素が複数ある場合、タイプレベルのリストの前にアポストロフィを付ける必要はないことに注意してください。アポストロフィは、0または1要素のタイプレベルのリストがあいまいであるためにのみ必要です(通常のリストタイプコンストラクターを参照している可能性があります)
Gabriel Gonzalez

1
私は承知していますが、アポストロフィは一般に昇格されたデータ型にとってちょうど良い形であるという印象を受けました。EGはProxy :: Proxy True動作しますが、と記述する方が適切Proxy :: Proxy 'Trueです。
スティーブンアームストロング

1
どのタイプのシステムを分類できるかに応じて、さまざまな軸を折りたたまない方が良いようです。Barendregtのラムダキューブにはすでに3つが含まれており、さらに単一の弱-強軸に沿って、静的対動的、およびパラメトリック対アドホックなポリモーフィズムも含まれています(後者は、型を作成するためのサーバントテクニックを可能にするものです) ')。
user2141650

1
公正な点ですが、答えは既に非常に長いので、ラムダキューブが実際に意味を持ち始める前に、型理論の研究に十分に取り組まなければなりません。さらに、非常にニッチの外側は(と私はすでにハスケルとさえAgdaを含めていますから、私は本当に意味ですかかなりあなたが本当に、例えば、依存型が、無いタイプの演算子を持つ言語を見つけるつもりされていない、言語ニッチ) 。
スティーブンアームストロング

'[xs]構文を簡単に説明できますか?これは明らかにa Charではありませんが、代替構文をどのように有効にするか、TypeOperatorsまたはDataKinds有効にする方法はわかりません。それはある種の準引用ですか?
wchargin

10

私はScalaで書かれた大規模なプラットフォームの中核チームで働き始めたところです。Scalatra、Play、Slickなどの成功したオープンソースアプリケーションを調べて、動的データ形式との相互作用についてのより詳細な質問をどのように処理するかを確認できます。

Scalaの強力なタイピングの大きな利点の1つは、ユーザー教育です。コアチームは、型システムで決定を下し、それらの決定を実施することができます。そのため、設計原則にあまり詳しくない他のチームがシステムとやり取りする必要がある場合、コンパイラーはそれらを修正します。プルリクエスト。これは、規模システムでは大きな利点です。

もちろん、すべての設計原則を型システムで実施できるわけではありませんが、型システムが強力であればあるほど、コンパイラで実施できる設計原則は増えます。

ユーザーにとって物事を簡単にすることもできます。多くの場合、彼らは通常のコレクションまたはケースクラスで作業しているだけであり、ネットワークトランスポートの必要に応じて自動的にJSONまたはその他のものに変換しています。

強力な型指定は、非サニタイズ入力とサニタイズ入力などを区別するのにも役立ちます。これにより、セキュリティが向上します。

また、厳密な型指定は、型をテストするだけのテストを必要とする代わりに、テストが実際の動作に焦点を当てるのに役立ちます。これにより、テストがはるかに快適になり、焦点が絞られ、より効果的になります。

主な欠点は、言語と言語パラダイムに不慣れであることであり、それは時間とともに修正可能です。その他には、努力する価値があることがわかりました。


8

直接的な答えではありませんが(まだhaskellで+30.000 LOCコードベースに取り組んでいません:(..)、https: //www.fpcomplete.com/business/resources/case-studiesをチェックしてください/これは、実際の業界設定におけるhaskellの多くのケーススタディを特徴としています。

-もう一つの良い記事は、彼らの経験ハスケルに変更する記述IMVU、あるhttp://engineering.imvu.com/2014/03/24/what-its-like-to-use-haskell/を

大規模なアプリケーションでの個人的な経験から、特にシステムで可能な限りエンコードしようとする場合、タイプシステムは非常に役立ちます。物事のリファクタリングに関して、真の力は本当に明らかです。つまり、メンテナンスなどは、それほど面倒な作業ではなくなります。

あなたが一度に非常に多くの質問をしているので、私がお勧めするリソースへのリンクをいくつかダンプします。

閉会の辞として、外の世界への対処に関してはいくつかの方法で行われます。あなたの最後のものは次のように、型安全であることを確認するためのライブラリがありますアイソーン JSONのため、Esqueleto SQLおよび多くのために。


1
回答のおかげですが、fpcomplete.com / business / resources / case-studiesのケーススタディは利用できなくなりました。
Saurabhナンダ


3

私が見たもの:

いくつかの大規模なRuby Webアプリケーション(Rails)、1つの大規模なHaskell Webアプリケーション、およびいくつかの小規模なアプリケーションを使用しました。その経験から、メンテナンスや学習曲線の低下などの点で、Haskellアプリケーションでの作業はRailsよりはるかに簡単だと言わざるを得ません。私は、これらの利点はHaskellの型システムと関数型プログラミングスタイルの両方によるものであると考えています。しかし、多くとは異なり、型システムの「静的」な部分は、動的なコントラクトを使用するときに得られるメリットがまだあるという点で、非常に便利だと思います。

私が信じるもの

Haskellプロジェクトがより良いメンテナンス特性を達成するのに役立つと思う主な機能のいくつかを提供するのに役立つ、Rubyと呼ばれる素晴らしいパッケージがあります。コントラクトRubyは実行時にチェックを実行するため、高いテスト収束と組み合わせると最適ですが、Haskellなどの言語で型注釈を使用する場合と同じインラインドキュメントと意図と意味の表現を提供します。

質問への答え

上記の質問に答えるために、Haskellや他の先進的な型システムの言語に精通できる多くの場所があります。しかし、完全に正直に言うと、これらの文書ソースはそれ自体優れているものの、Ruby、Python、Javaなどの言語で見られる大量のドキュメントや実用的なアドバイスと比較すると、少し圧倒されているように見えます。いずれにせよ、Real World Haskellは古くなっていますが、それでも良いリソースです。

カテゴリー理論

Haskellを選択した場合、カテゴリ理論を議論する多くの文献に出くわします。IMHOカテゴリー理論は有用ですが、必須ではありません。Haskellコミュニティで普及していることを考えると、タイプの長所と短所をカテゴリ理論の実用性についての感情と混同するのは簡単です。これらは2つの異なることを覚えておくと役立ちます。つまり、カテゴリ理論に基づいた実装は、静的型と同様に動的型付け言語でも実行できます(型システムが提供する利点をモジュロ)。一般に、高度な型システムはカテゴリ理論に拘束されず、カテゴリ理論は型システムに拘束されません。

タイプの詳細

型を使ったプログラミングとそこにあるテクニックについてもっと学んでいくうちに(その楽しさゆえに非常に早く起こります)、型システムを使ってもっと表現したくなるでしょう。その場合、私は次のリソースのいくつかを調べて、これらの機能を備えた工業品質のツールが使いやすいインターフェースを公開するもの(Contracts Rubyなど)にのみパッケージ化されることをツールベンダーに認識させます:


2

最初に、弱い型付けと強い型付け、静的と動的な型付けの間に答えが混同されているように感じます。提供されたOPを明確に区別するリンク:

強力な型システムとは、コンパイル時の制限または実行時の機能が魅力的な型システムです。

弱い型システムは、その制限または機能を欠く型システムです。

たとえば、変数はコンパイル時に入力されるため、C、C ++、およびJavaは静的に入力されます。ただし、言語ではvoid *ポインターとキャストを使用して制限をバイパスできるため、CおよびC ++は弱い型付けと見なすことができます。このトピックの詳細。

この区別では、厳密な型指定が優れている場合があります。失敗が早ければ早いほど良い。

ただし、大規模なプログラムを作成する場合、型システムが重要な役割を果たすとは思いません。Linuxカーネルは、Cおよびアセンブリで記述された1,000万LOCであり、非常に安定したプログラムと見なされます。おそらく、セキュリティホールでいっぱいの200のJava行からは遠く離れています。同様に、動的に型指定された「スクリプト言語」は、大規模なプログラムの作成に関しては評判が悪いものの、値しないことの証明(Python Django、70k以上のLOCなど)がある場合があります。

私の意見では、品質基準がすべてです。大規模なアプリケーションのスケーラビリティに対する責任は、プログラマーとアーキテクト、およびアプリケーションをクリーンにし、テストし、十分に文書化するという意志のみが負うべきです。


-1

大規模なアプリケーションでこれらの強力な型システムと静的/コンパイル時機能を使用する方法についてどこで読むことができますか?

以前の回答からhttps://www.fpcomplete.com/business/resources/case-studies/

これらの強力な機能の標準的な「ハローワールド」のような紹介を超えてどのように移動しますか?

それは本当に他の言語のように強さを構築する

リッチタイプシステムを使用してビジネスドメインの問題をモデル化するにはどうすればよいですか?

抽象データ型、またはより一般的にはポリモーフィズムを使用する

タイプシステムは、30,000 LOC +ゾーンにいるときに役立ちますか、それとも妨げになりますか?

それはずっと役立ちます。型システムは、必要な結果の形状を示すため、コードの記述に役立ちます。実際にAgdaはあなたのためにコードを書きます。

PS:型システムを持ち、自分で型を記述しなければならないという間違いをしないでください。これはばかげています。コンピューターがあなたのためにそれを行うことができます。

システムが弱く型付けされた外の世界と対話するとき、これらの型システムによって提供されるセーフティネット(およびコンパイル時チェック)に何が起こるか。JSONまたはXML API、さまざまなデータストア、ユーザー入力などを介して

型を介して値の構造を知ることは、コンピューターが(デ)シリアライザーを作成する方法を推測できることを意味するため、素晴らしいです。

型と抽象化について本当に知りたい場合は、型の理解、データの抽象化、および多態性についての最良の紹介があります。

それは紙であり、きれいな写真のケーススタディではありませんが、啓発的です


-2

Webアプリケーションに多く携わる.NETプログラマーとして、型付けされたC#と型付けされていないJavaScriptの両方の側面を見ています。

あなたが尋ねる質問に関する文献を見たことがあるかどうかはわかりません。型付き言語では、これらすべてのものを当たり前のように受け止めます。型のないものでは、型を不必要なオーバーヘッドとして定義しています。

個人的には、厳密に型指定された言語が、同等の単体テストの作成と比較して、非常に低コストで記述した利点を提供することを否定することはできないと思います。弱く型付けされたシステムとのやり取りには、通常、DataReaderなどのオブジェクトの配列や辞書などの汎用型、または文字列や新しい動的クラスの創造的な使用が含まれます。基本的にはすべて動作し、コンパイル時間ではなく実行時エラーが発生します。

非常に短いプログラムを作成したい場合、たとえば数行で関数を定義してより大きなアプリケーションで動作するようにしたい場合は、クラスを宣言する余地がありません。確かに、これはJSなどのニッチな型付けされていない言語が占めていますか?


型付き/型なし、または静的型付き/動的型付きを意味しますか?JavaScriptは型付けされていませんが、動的に型付けされています。
ジョルジオ

2
タイプを定義する必要はありません。ハスケル、OCamlで、SML、F#...:まともな言語はあなたのための型推論します
ニコラ・

1
あなたが強く型付けされた言語に使用されている場合、私はあなたがVARまたは何を使用できることを確認しますが、そのわずかコンパイラのトリック「クラスを作成」を意味するタイプの定義と言うとき、他のすべては、型なしである
ユアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.