質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

4回答

1251閲覧

型定義が分かれている言語は何がありますか

退会済みユーザー

退会済みユーザー

総合スコア0

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

1クリップ

投稿2020/09/24 04:28

探しているもの

Kotlin や C# などの静的型付け言語、もしくは Python や PHP などの型を書いても書かなくても良い言語で、
型を書く場所が分かれている(独立している)言語はありますか?

これらの言語では関数定義の間に型情報を挟む形で記述するかと思います。

Python の例:

py

1def add(num1: int, num2: int) -> int: 2 return num1 + num2

C# の例:

c#

1int Add(int num1, int num2) 2{ 3 return num1 + num2; 4}

そうではなく、型定義だけを別に書ける言語を探しています。

これまで私が見つけたものでは、 Haskell を元にした JavaScript Framework の Elm という言語はそうなっていました。

elm

1update : Msg -> Model -> Model 2update msg model = 3 case msg of 4 Increment -> 5 { model | count = model.count + 1 } 6 7 Decrement -> 8 { model | count = model.count - 1 }

上記の 1 行目が型定義部分で、 2 行目以降が処理の本体となっていて分かれています。

このように型定義部分が分かれている言語は何がありますでしょうか?

探している理由

探している理由としては、分かれている方が見やすいと考えているからです。
上記に上げたほどシンプルな例であればどちらも大差はないと思います。
しかし、実用するくらいに複雑になると型定義が複雑になり、とても読みづらいものとなります。

多くの場合、読みたいのは処理であり、型定義は不要です。
そのため、複雑な型定義が挟まってくると邪魔なものが多く読みづらくなります。
上記のような関数定義で言えば、どれがパラメータの名前であるのかもパット見では判断できなくなります。
型定義が存在しない JavaScript などを見ると処理のみが書かれていてすごくスッキリとして読みやすいです。

しかしながら、何をしているか読むだけではなく、機能の追加や修正をしようとすると、型情報が全くないというのは不都合も多く、型定義を書けない言語にすれば良いというわけでもないです。
そこで自分が最も見やすいのは何かと考えると、型定義が独立、せめて別の行にあることだと思いました。
しかし、メジャーどころをいくつかみたものの、 C 言語に引っ張られているものが多いのか、構文のパースの都合なのか、型定義を間に挟むものが多いです。

Elm ではだめな理由

上記の通り、 Elm は条件を満たしています。
しかし、 JavaScript Framework なため、 Python などのようにいろいろなところで使える言語とは異なります。
Elm の元になった Haskell であれば、可能ではあると思うのですが、言語として難しく、やはり Python などのように気軽に使えるものではないです。
もう少し扱いやすい言語でそういったものがないかを探しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

JavaScriptにJSDocで型をコメントとして書いておく、というような手法はどうでしょうか?

投稿2020/09/24 04:36

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/09/24 04:38

> そのため、複雑な型定義が挟まってくると邪魔なものが多く読みづらくなります。 CやC++ではtypedefという仕組みがあって、複雑な型定義にはそれ自体の名前をつけることが可能です。
退会済みユーザー

退会済みユーザー

2020/09/24 06:00

JSDoc は考えました。 しかし、あくまでコメントなので、エディタやIDEのサポートはあるものの、(私が知る限り)ビルド時にエラーが出たり、実行時にエラーが出たりはしないと思います。 それだと型を強制できませんし、加えて通常コメント同様に変更時にコメント側の変更漏れなどがありそうです。 そういう理由から言語自体のサポートがある記法のほうが良いかなと考えています。 typedef については分けて書く場合でもわかりやすくなる良い仕組みだと思います。 しかし、テンプレートやジェネリクスみたいなものを含めすべての型に名前をつけていくのは現実的でない部分もあり、やはり型情報が分かれている方が見やすいと感じます。
maisumakun

2020/09/24 06:40

TypeScriptでも、状況によっては「型だけ別に書く」ような書き方をすることは可能かもしれません。 type testFunc = (x: number) => string; const foo: testFunc = x => { return x + 'hoge' };
退会済みユーザー

退会済みユーザー

2020/09/24 07:37

TypeScript でもできるのですね。 .d.ts ファイルがあるので、通常の .ts ファイルの方には一切型を書かずに JavaScript と同じコードにできるのかなと思いはしたのですが、そういう書き方をしてる例が見当たらず、そういった使い方はできないものかと思っていました。
guest

0

古いパスカルは関数の内部ですが、
実装部分と宣言部分が別でした。

pascal

1function f(n:Integer):Integer 2var 3 x:Integer; 4 sum:Integer; 5begin 6 sum := 0; 7 for x:=0 to n do 8 sum := sum + x; 9 result := sum; 10end;

みたいな感じに。

今ではDelphiがPascalを採用しています。
大幅に拡張されてて、最近は上のルールを外れて、
関数内部でも型宣言が可能になっちゃったみたいだけれども。

投稿2020/09/24 05:28

編集2020/09/24 06:35
amiya

総合スコア1218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Ruby3.0では別ファイルに書くという話があります。
参考:
Ruby3で導入される静的型チェッカーのしくみ まつもとゆきひろ氏がRubyKaigi 2019で語ったこと
去年の話なので、現時点でどうなっているかは知りませんが。

投稿2020/09/24 05:25

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/24 06:07

Ruby はそういう方針なんですね。 メジャー言語ですし、そうなってくれると嬉しいです。 個人的には関数であれば関数定義の前後にあるくらいでいいので、別ファイルまで行ってしまうのは極端な気もしますが、エディタやIDEサポートでマウス乗せれば表示されるのであれば、ソースコードのファイル自体は型情報がなくスッキリしてベストなのかなと思ってます。 3.0 が出たら見てみようと思います。
guest

0

F#

1let addTwo : int -> int = fun x -> x + 2 2 31 |> addTwo |> printf "%A" // 3

vscode + ionide 拡張
コメントっぽく型を表示してくれます

イメージ説明

投稿2020/09/24 04:37

編集2020/09/24 06:44
ozwk

総合スコア13553

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/24 06:04

なるほど、そういった書き方で = のところで改行すれば、 F# でも分けることはできますね。 関数型言語ですが Haskell よりは使いやすいと思っているので良さそうです。 ただ、一般的な書き方からそれると思うので、自分で書く分には良いのですが、ライブラリを読むなど他人のコードではそうならない点では言語で決められた標準の書き方でそうなってるほうが良いかなと思っています。
ozwk

2020/09/24 06:30 編集

別回答へのコメントですが > エディタやIDEサポートでマウス乗せれば表示されるのであれば ということならVSなら普通に書いてもマウスオーバーで型が出ます。 ...と思いましたが引数も出ちゃいますね vscodeならプラグイン入れれば関数定義の上に型情報が表示されたはずです https://qiita.com/7shi/items/5fc7d6477d96bbd7a71d
退会済みユーザー

退会済みユーザー

2020/09/24 06:29 編集

別ファイルで引数や返り値の型を書くらしいので、いざ見たいと思ったときに関数定義の前後に型情報がなくて別ファイルをいちいち見に行くのは面倒に感じたのですが、マウスを乗せて表示できるなら別ファイルでも良いなと思ったということです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問