【.NET】F#について語れ3【OCAML】
F#勉強中 ocamlがいいと思ったけど uint32やuint64のデータ扱う必要があったのこっちにしてみた 書き方が違う…ていうか書き方だけが違う。 どっちも共通言語基盤を記述するための.NET Core上の言語だから。 C#で使えてF#で使えないやつあるから 書き方違うだけじゃない F#で使えてC#で使えないものどんだけあると思ってんだよw そいえばF#4.7になったんだね。 nextっていわれてるのが5.0になるんですか? C#使いが感動しそうな機能とかない? ちょっと興味がある。 代数型全般。 型推論 デフォルトイミュータブルで副作用を起こしにくい 遥かに便利なパターンマッチ ユニットオブメージャー コンピュテーション式 タイププロバイダー 5からの状態マシン作成 まあC#に比べてコード量が半分以下になるのが1番の利点かな REPLも使いやすいと思う。LINQPADとか使ってるならまた別かもだけど 地味なとこではobject式もアドホックにインターフェース実装できて便利 ありがとう! 思った以上に自分の知らない機能があって驚いた。 F#の勉強をしてみる! VS2019のオプションのF# デスクトップ言語のサポートは ネットの情報だとF#だから入れとけば的なノリのようだけど 他のツールセット→データの保存と処理 (説明:SQL Server、Azure Data Lake、Hadoop を使用してデータ ソリューションの接続、 開発、テストを行います。 ) をチェックするとこれにチェックつくんだよね もっと詳しい説明ない? getterじゃない? 厳密にはILレベルではメソッドだけど >>23 プロパティだけど単に実行してその結果を受け取るためのキックとして使ってるだけでプロパティかメソッドかは別に重要じゃない 新しいF#の拡張機能が凄いって話題だけど C#と比較して色々まさるらしい コンビネータでの構文拡張でC#より高速なコードが出せるとか ちょっとした革命的な部分があるとか これらの機能拡張のおかげでF#は控えめに見て最強かもな自画自賛 C#の弱点をF#は回避できる、結果C#より実行速度の速いコードが吐ける MS内でF#は使われていないとか 使われていないので積極的な開発もなくてF#は死んだとか言われてたけど もしかして逆転満塁ホームランかな〜 F#って実はなんでも出来ちゃうC#並みになんでもって言われてて そこに今回の話題です >>30 その機能の事は知ってるけどまた改めて話題になってたん? >>31 twitterのタイムラインで知った、なんか凄そう ごめん、フォローしてる人のツイートでした 9月30日付けの記事 F# vNext は何が "ヤバい" のか: Monadic Programming の新時代 4.3 すべてが F# になる ttps://qiita.com/cannorin/items/1936faded610c3ab6c18 F#は宇宙その物なのに なぜ、人気が無い バンバン f#のapiリファレンス見れますか? Listモジュールの関数一覧を知りたいのだけど。 久しぶりにいじったらfsxのスクリプトとかもけっこう動作速くてビビった HTAとかpowershellの重いやつF#でポツポツ書き直しとる vbsでコマンド窓出さないラッパとかも.netのほうがふつうに速いな fsxって今でも実行にf#のランタイム必要? exeにコンパイルすればstandaloneになるけど。 windowsビルトインだけでfsxが動くなら配布しやすいんだよなー ランタイムが何を指してるか知らんけどどのみちfsiがなきゃ動かんだろ F#って、DBにデータが存在するとき上書き警告のポップアップをだして更新、なければ挿入、的な処理は作れるんですか? 純粋と言われているHaskellでさえ出来る F#なんて、何でもあり イベント、オブジェクト、フォームプログラミも .netのクラスも、Win32も使いたい放題 ていうか、関数型プログラミングって、従来とそんなに違うもんなん? 手続きは基本的に個々のステートメントでIOが入るイメージ 変数への代入という意味なら、λ式使うと出来るよ Haskellのモナドはそうやってるし へ? State関係ないあるよ do記法の代入は糖衣外すとλ式に変換されるってことだけど 適当に探しても見つかるな >>=をパイプラインと見れば… https://qiita.com/saltheads/items/6025f69ba10267bbe3ee それは代入じゃなくて束縛 この文脈で変数への代入ってputとかmodifySTRefとかでしょ MVUアーキテクチャは関数型言語と相性いいと思うんですけど、f#でguiやるとき何使ってるんですか? 素のWinFormsとか素のWPF? なにかいいフレームワークあったら教えて下さい。 fsprojectsがサポートしてるのはよさそう。 XamarinForms使ったことないんですがUWPアプリになるんですか?クラシックアプリではなくて。 誰か使ったことある方いますか? donet cliでプロジェクト作るときにWPFオプションつけるとクラシックアプリを作れるような気がする。 後で試してみる WPFはサポートしてなかったっけ? 今も開発続いてるならWinUIとかにも対応しそうだが buildtoolsのみインストール、xamarin入れてない環境。 WPFオプション付けてプロジェクト作成、dotnet runでウィンドウ出ましたわ。コンソールにxamarinがどうのって警告でてるけど。 教えてくれた人ありがとう。 elmishと違ってUIもfsharpで書けるのね。 ちなみにUIのプロジェクトはnet475だった。netcoreappじゃないんだね。 fabulousはメジャーアップデートのpreview版リリースが続いてるみたいだけど、net5に対応するのかな ひとまず、elmishで悩んでたことをこっちで試してみます。 F#の文法の基礎とかアプリを作るまでの流れを学びたいんだけど、お勧めはありますか? 最初はオライリー買おうかと思ったんですけど、2010年08月発行とかなってて心配です。 どういうバックグラウンド持った人か知らないけど、ベースから固めていきたい人ならf# 入門でググった結果→必要あればdocs.microsoft.comでいいと思うよ 作りたいアプリが決まってるなら、フレームワークの使い方から学んだほうが早いんでないかな。 >>72 古い本だけどこれ良いと思うよ F#を使って関数型なプログラムするのどうしたらいいかっての書かれてる F#は3でtype providerとか大きいの入ったけどそのあとはこまめな変更入ってる感じだしこの本の内容は今も全然生きてる https://www.manning.com/books/real-world-functional-programming でもアプリ作る所、はあまり書いてないかも アプリが何を指すか分からんけど >>75 ありがとうございます。英語ですか・・・。 作りたいのはWindows用のGUIアプリで、 在庫管理の入力や報告書の作成とかの会社の雑務を自動化出来たらなと思ってます。 もちろんもっと相応しい言語や環境があるのは分かっています。 ただ会社に許可は貰ってますが、特に求められても急ぎでもない半分趣味なので 折角なら前から興味のあった関数型言語でやってみよう、Windowsなら.NETかなという感じです。 プログラミング経験はVBA、Python、TypeScript、PowerShellの様なスクリプト言語のしかありません・・・ GUIを作った経験はほとんどなく、基本的に開発環境から直接実行していました。 一応すごいHは読み終わっていてオブジェクト指向との違いは概ね理解しているつもりです。 >>77 日本語の本ほとんどないからねぇ… 自分はXamarinとかWindowsストアアプリでF#使ってたけどまあUIの仕組みとしてはMVVMであとはなんでもいいんじゃないですかね Fabulous使う手もあるかもだけど 上げられたようなアプリでいいならFabulousをWPF向けに使うので間に合いそうな気はします。 MVVM使った方が堅いとは思うけれど MVVMの場合は全部F#でもいけるけどUI側はC#でやってVMから上はF#ってした方がデザイナでIDEの手助けを得やすいとかはあると思いまうす そういえば、.net 5って、Linux上のフォームアプリって未対応なん? 期待してたんだけど Hakellってループすらない 腹たつのり ところで、F#のシャドーイングって、ループのためにあんの? 関係ないでしょ 自分的にはそこ以降のスコープではそれより前にあるものをさわれなくする仕組み 覚えているけど 名前からするとそっちかもしれんけど でも、再代入とほぼ同じに見えるから… って思ってた ただ、ループ中のシャドーイングやってみると、代入と違う動作だた。 最後にシャドーイングされたものが、次のループでも生きると思ってた っていうことで、撤回 fsdn稼働してないね、やめちゃったの?便利だったんだけどな dotnet cliしかインストールしてないせいか知らんけどFsharpApiSearch動かんし。 レポジトリのreadmeにかいてあるよ hoogleみたいなやつ シグネチャ元に探せるってやつだよね? どういう時にそれが便利なのかがよくわかっておらず 必要なapiをそらで言えれば、たいていは必要ないと思います。 自分は型でパズルしてるから使ってた。 例えばこんな問題どう? // 改行区切りのコマンドリスト let exec (cmdLine: string): () = pass // 各ファイルへのコマンドを作る let commands (filenames: string list): string = …filenames …|> List.map (fun n -> ………………………[ ………………………Command (foo n 0) ………………………Command (bar n) ………………………Command (foo n 1) ………………………] …|> 平たくしたいんだけどapiなんだっけ commands |> exec あぁ…推敲しきらずポストしてもうた 怪しいところは汲み取ってください 要は、欲しい型はわかるんだけどapi覚えてないってときに使ってる なるほろ 使ってみたら便利なのかも知れるなと思いつつ今はダメなのか W10Wheel.NET (F# 4.1) のソースを Visual Studio 2013 (多分 F# 3.1 だよね?) でビルドすることってできないもんかね? W10Wheel.fsproj の中の TargetFSharpCoreVersion タグの値を 4.4.1.0 から 4.3.1.0 に書き直して挑戦してみたけど、後述のエラーでとおらなかったんだわ 唯一解決できたのは「エラー FS0039: 名前空間またはモジュール 'FSharp' が定義されていません」の行の open FSharp.NativeInterop → open Microsoft.FSharp.NativeInterop の手直しだけ 他の場所も、同様に機械的な手直しで潰せるなら、方法わかる人、教えてくれたら大感謝! -- エラー FS0039: 値またはコンストラクター 'Ok' が定義されていません エラー FS0039: 値またはコンストラクター 'Error' が定義されていません エラー FS0039: パターン識別子 'Ok' が定義されていません エラー FS0039: 値、コンストラクター、名前空間、または型 'defaultValue' が定義されていません エラー FS0039: 値、コンストラクター、名前空間、または型 'contains' が定義されていません そこら辺4になって追加されたりしたやつだろ エラーになってるところ変えるなり同じ挙動するもの定義したりすれば良いのでは うん、そこまでは想像ついてる>4系で追加 なんで、その置き換えとか、言語知識なしでも機械的にA→B的置換とかでできないもんか? という相談 追加されたものはリフレクションなりぶん回せば取れるだろうけど、中身は自分で実装しなきゃだろうし。 Fosrynとか使って中身も持ってくるかソース直接見るか いや流石にそれはないだろw 原理的に無理では イミュータブルでものによっては早くなるパターンがあるとかならまだわかるけど まだ実用的なもの作ってないが MSとは思えない程のエレガンス、ML系の正統な後継者だわ 兄弟国 といえば どこ? しかし似てんな やることも言うことも ロシア語表記の袋入り注射器、山形の海岸にも漂着…砂浜数百メートルに散在 https://www.yomiuri.co.jp/national/20220315-OYT1T50098/#: ~:text=数百メートルに散在,-2022/03/16&text=山形県庄内総合支庁,いるが、県内では初めて。 ocamlをWindowsで使うのが辛いので、ありがたい。 勉強してアプリ一つ作ってみたけど結局C#でいいやってのが感想だった まあそう思うならそれでいいんじゃね? ワイは使えるならF#のほうが遥かにマシだけど まあF#らしい使い方しなければその恩恵は得られないんだから仕方はないだろ テンプレの整備とかもアレだし デフォルトイミュータブルにならないしパターンマッチもよく分からん記法だし末尾最適化もないしunionがやっと来るのか来ないのかだし、何をもって圧勝と言ってるのか分からん マジでなんで圧勝なの? ワイはF#の方が良い(イミュータブル、REPL、簡潔な構文・型定義など)けど、まあお前が思うならそうなんだろうとしか F#の方が良いと思う人が多ければこんな状況にはなってないよねとしか 俺はF#が良いと聞いたから勉強してアプリ1つ作り上げてやっぱC#だわと思った両方使える人なんだわ C#でもイミュータブルやREPLは使えるしC#の方が簡潔に書けることも多いのでお前F#しか知らんだろとしか思わん とりあえず言語の良し悪しと主流になるかは一致しねーよ js知らねーのかアホ 部分的にC#の方が簡潔にできるところはあるが全体通してコード量が短くなる事はねーよ とりあえずお前がろくにF#知らない低脳チンカスってのはわかったからもういいよ まあ最近はC#触るんでもUnityがメインなんで新しいバージョンの記法は追ってないからその辺で進化してたならすまんけど コンストラクタで渡したものメンバーに代入とかしないで使えるようにとかもうなった?union来た? F#は進化の速度が遅いしメインストリームから取り残されてるのが難点 結局C#に乗り換えなきゃいけなくなる未来が予測できるのがいや 未来というか現在のBlazorどうすんのよ Boleroじゃ代わりになんねんだよ >>119 コンストラクタに渡したものをコーディング無しでプロパティに代入したいならrecordやDIがあるから特に不便はないかな unitは欲しいね >>121 まあそこは分かる ライブラリーとして使う分には使えなくなる事はないのかなとは思うけれど.NET Nativeみたいにビルドから対応してないみたいのが出てくるとあれ そこはCILとして対応し続けてほしい所だがの >>124 F#のアセンブリは.NETと完全な互換性はないからそのうち使えなくなることはあり得る 完全互換じゃないってどういう話? CILから外れてたらそも動かんやろ? >>127 F#の関数はC#から使えないこともあるって知らないか? それはC#がCILを満たしていてもなんでも呼べるわけではないって話じゃないの? C#からのF#の呼び出し、やったの前だし呼びやすい形に調整してたから全部がどうとかは知らん。 とりあえず具体的にこの辺の項目とか上げてくれ。完全性求められても知らん CILがどうとかじゃなくF#の関数はF#が消えたら呼べなくなるからdllだけ残っても何の役にも立たんよってこと internalじゃないやつは静的クラスのメソッドとして呼べるだろ? その辺のF#だけからしか呼べない形態、どれがあったのか忘れた(というかあまり問題にしてなかった)けど、他から呼べるように公開したいものはそう出来て、それはCILにのっとってるんだから>>126 はちょと違うんじゃ?と思った次第 流行らないなあ、キレイなML+標準ライブライブ超充実の、歪なようで噛み合う組み合わせがめっちゃ面白いんだけど コミュニティには参加してないけど、むしろ面白さを重んじる俺みたいなアマチュア好みだからプロに疎まれてる感とかあるのかなって 海外とかでメイン言語として採用してる会社とかもあるしプロだから、とかは別にないでしょ ただやはりいつまであるのかってのは客からも上がってくるからそういうのを忌避したいとことか別にC#でいいんじゃ?って思うところはあえて採用しようとはしない、って感じじゃ 自分は生産性上がっていいと思うけどね vbがどうなったか覚えてるだろ? あのマイクロソフトの代名詞にもなったvbが切られるんだからな C#で十分な生産性が確保できる以上、五十歩百歩のメリットしか出せない割にデメリットのでかい別言語は要らんのよ ほとんどスタッフの趣味で続いてるようなもん うんだから、お前がロクなメリットを引き出せてない話はわかったからそれはどうでもいいです C#のUnionはC#10に実装の話も出てたけど11にも間に合わなかったな 型制約とenumで似たようなことができるとは言えあればあったで便利だと思うんだが QiitaのF#を知ってほしい人もlinuxだし M.Hiroi氏もWSLのUbuntuでF#入門やってた windowsのVisualStudioじゃなくて わざわざ仮想マシンやWSLのlinuxでやるのが主流なのかね C#から呼び出せるとか.netライブラリ使い放題とかは正直微妙に終わったと思う その代わりUnix系言語の1つとして認められるようになった この板はwindows系の言語は無視される傾向にあるのでそれはよいことだ 俺みたいにwindowsのCUIでしか使ってないごく少数派からみれば微妙ではあるが dotnetになってからコマンドラインだけでやるのはもうしんどいというか無理があるね 設定をxmlで書かないといかんし調べてもよくわからんかった fscとfciでがんばり続けるほどのレガシーもないからいいけど Fableやろうとしたけど環境構築で死んだわ もうちょっと情報が充実してくれると助かるんだけどねえ >>142 winget install dotnetなんとかsdkのコマンド一発で環境構築終わらなかったっけ wslは知らないけど、pc向けlinuxならwingetの代わりにaptとか別のパッケマネで挿げ替えれば通った記憶があるので、linux/macOSなど若干アウェーな環境でも特に障壁はないはず 好みの問題かと >>144 Fableで何をしようとしているかにもよるけど、SAFE stackとかは? >>146 フロントエンドだけで使う想定だったんで、SAFEだとちょっと大掛かりかなと思ってた ちなみに原因はFableじゃなくnode.jsの依存関係にあった npm installした後にnpm audit fixコマンドで脆弱性潰せみたいなメッセージが出るけど、 このコマンドを実行したせいで依存関係がめちゃくちゃになったらしい 無視したら普通にnpm startでコンパイル成功した >>147 なるほど。まぁ解決してるようなので良かったです。 Fableは日本語の情報が少ないので苦労するよね。 最近は個人的にFable.Litがお気に入り。 YouTube で有名な雑食系エンジニア・KENTA の動画がある EC2はもうオワコンです www.youtube.com/watch?v=G_ILES8fmf8 もう、Windows の実行環境がない。 もう、OS, AWS EC2 も使わない。管理・構築しない すべてコンテナ・Docker へ移行した。 使うのは、AWS Lambda, Fargate, Kubernetes DockerはLinuxだけの技術で、他のOSでは使えない。 Microsoft も、Linux財団に加入して開発している >>149 Elmishも有れば、Felizスタイルっていう素のReactっぽい書き方も有ります。 この辺は好みで選べる感じみたい。 自分はElmishに慣れてしまったのでFelizスタイルはよく知らないっす。 Felizは初めて聞いた。フロント絶対触らないぞ、と頑張ってきたけどぼちぼちやらないといけなくなってきたからちょっと見てみるわー jsでやるよりやっぱり楽かなー F#についてはまったくの初心者です fortran pythonをうごかしていました 質問ですがf#でコマンドラインで実行ファイル作成法がわかりません c#ですとコンソールで csc file.cs と打って 実行すれば実行ファイルを作成できます F#にもfsc.というコマンドがありますがエラーになります dotnetをつけてもだめでした visual studioでbuildをすればいいのかもしれませんが visual studio不慣れで使いたくありません f#ではコマンドラインで実行ファイルをつくることはできないのでしょうか できないならf#はあきらめc#を勉強しようと思います ご教示よろしくお願いします fsiでスクリプト実行じゃなくてコンパイルしたいなら、面倒だけどdotnet new --lang指定でプロジェクト作ってdotnet build >>154 ありがとうございます 以下を実行しました program.fsを作成 dotnet new console -lang F# -o program -f net6.0 cd program dotnet build cd bin/bpc/debug/net6.0 program.exe 実行ファイルはできましたが ソースひとつごとにプロジェクトを作成して 実行ファイルはソースと別のディレクトリにできる ということになりますね fsiを動かすにしても1ソース1プロジェクトのようですし これで作業は効率的なんでしょうか visual studioを使えっていうことでしょうかね これまで editorでrソース作って コンパイルして実行という手順に慣れている者にとっては面倒ですね fsc.exeはいつ使うんでしょうかね やはり C#かな build時のデバッグ情報にfscの呼び出しあるだろ?真似ればいいんじゃね 自動で適切な引数渡してくれるのに、わざわざ自分でコンパイラオプションや必要なアセンブリ集める方がよっぽど面倒だと思うが そもそも初心者が実行時コンパイルの僅かなオーバーヘッドを気にするべきじゃないと思うんだが fsiスクリプトはほとんどの言語より高速だし、fscを触るのは本当にパフォーマンスに困ってからでいいかと コンパイラの仕組みに興味があるなら https://github.com/dotnet/fsharp/blob/main/docs/overview.md コマンドラインのオプション解析、parsing/lexing、参照解決、型チェック、最適化、バイナリ生成etc 全てfsharpで書かれてるので勉強にもなるし、ぶっちゃけマニュアル読むより速い >>158 MSの長い識別子と、頑強なんだろうけどベタ書きコーディングスタイルだとC#に見えてくる yacc/lex風のDSLで文法定義してるのはF#らしいし眺める価値ある >>155 こいつみたいに勘違いして文句つける奴ほんまうざい >>158 ありがとうございます。 fsc.exeもfsharp(?)で書かれたテキストファイルなんですね fsc.fsを155と同じ手順でコンパイルしてみました fsc.exeはできましたが、 fsc program.fsを動かしてもprogram.exeはできません 結果を表示しますのでfsiになっているようです ソースを書き換えればいいのでしょうが、私には無理です fsharp 勉強してみます >>161 すこし動かしてみました 表示はどうやってもHello from F# になります。 ソースを読み直してみます >>163 buildしなおしましたら エラー100個でました どうでもいい話でおさわがせしています。 原因わかりました 対処法わかりませんが dotnet new console -lang F# -o program -f net6.0 でプロジェクトをつくると program.fsは hello worldを表示するfsをつくります ソースをかえてbuildしたつもりでしたが、 常にprogram.fsをbuildしていました ですので何をしてもhello wolrdを表示していました。 おさわがせしましてもうしわけありません。 155の流れのバッチファイルをつくればいいのかと考えています >>161 ごめんよくわからない、>>158 のfscコンパイラのソースをコンパイルしたの? fsc(.exe, dll etc)がそれだから持ってるなら必要ないよ 引数に何を与えるべきかドキュメント読んで分からないなら、>>158 のコードは参考になるけど dotnetのプロジェクト管理が嫌なだけなら、>>156 の出力をコピペ&好きに改竄して、ps1でもbatでもshでもnmakeでもmakeでも好きな方法で呼べばいい dotnet build -v d (-verbosity detaildの略)ね ホスト、ターゲット、動的/静的リンク諸々全て環境依存だけど dotnet path/to/fsc.dll -o:path/to/fsharp.dll \ -g --debug:portable --noframework \ --define:TRACE -define:NET6_0 \ ... -optimize- --tailcalls- -r:path/to/dlls \ ... --target:exe --nocopyfsharpcore ... Program.fs みたいなコマンドを発行してはず というかこんな些末な事を気にする前に、とにかくfsiを立ち上げて公式チュートリアルでもこなせば ビルドできてREPLも使えてるのに何が問題なんだ? 自分好みのビルドスクリプトを書きたいようだけど、使ってない言語のコンパイラオプションを適切に選べるとでも思ってるのか そんなに俺々ビルドスクリプトを書きたければ、F#で書けばいいのに batなんかよりずっと楽に書けるぞ もう一度 fsc.exeを探しましたら 見つかりました おそらく visual studioをインストールしたときにできたものと思います 場所は c:\program file (x86)\Microsoft Sdks\F#\4.0\Framework\v4.0 コマンドプロンプト画面で fsc program.fsxと打つと program.exeができました fsi program.fsx でhello world も表示できました editor+コンソールでの作業に慣れていますので これで心置きなくF#を勉強できます おさわがせしましてもうしわけありませんでした 何でわざわざexeにしてるのか意味わからん 評価したいとこ選択して評価すればいいだろ FSI.exeが動きますので 評価はfsiでもできます ソース作ってfsiを動かすだけですので 私的にはテストを楽にできます 複数の機器でテストしたいこともありexeファイルも必要となっています。 visual studioをインストールしなくとも Visual F# Tools 4.0 RTM https://www.microsoft.com/en-us/download/details.aspx?id=48179 をダウンロード、インストールすれば f#のコンパイル環境をつくれました。 VS2022はwindows32ビットに対応していなかったのですが、これでF#をテストできます (dotnetを使えば動くようですが) vscodeで動かそうとしましたがデバッグの環境をうまく設定できず コマンドラインでうごかしています バージョンが古いせいかときどきエラーでとまります たとえば printfn "%s %s %s %s" names.[0] names[1] names[2] names[3] は Successive arguments should be separated by spaces or tupled, and arguments involving function or method applications should be parenthesized printfn "%s, %s, %s, %s" names.[0] names[1] names[2] names[3] にして動きました また、小文字、大文字を区別しているんですね しばらくエラーがでて考えてしまいました 関数型とは なんでも名前をつけるということなんでしうか 例えば a+bはadd とか 途中で数式を使わないということでいいんでしょうか 面白いですが 数値解析+画像表示に使えるかどうか letで関数作るとき 改行するとpythonのように文字下げしなければならないんだね わかるまで1日かかった ライブラリ FSharp.PowerPackを入れて複素数を計算してみようとしていますが出力方法がわかりません わかりましたら教えてください 単純化しています #r "FSharp.PowerPack.dll" let x = complex -1.0 0.0 printf (を出力) >>175 わかりました printf "%e,%e" x.RealPart x.ImaginaryPart また1日かかってしまいました 洋書なら比較的新しい環境構築も含めた入門書あるだろうから先にそれ読んだ方がいいんじゃないの F#の情報は、まあ少ないなあ プログラミングの一般的な知識や慣習が欠けてるならPowerPackで古い日本語サイトや書籍の多いML(というかOCaml)と大体互換になるので、それも参考に アマゾンでは評判悪いですが やさしいF#入門 日向健二著 で勉強しています。2010年出版ですのですこし古いかもしれませんが基本は同じかと windowsアプリケーションの例題を動かしてみました オブジェ久トに関しては今から勉強です それとは別に microsoft visual F# programming www.visualfsharp.com/index.htm でsystem.drawingでのグラフィックを試しています xplotとかplotlyが必要なのかと思っていましたがどうなんでしょうか >>173 関数型とは何か、なんて言える程偉くないのでとりあえず 処理を連ねて書き(パイプライン、|>)、抽象化できる部分に名前を付けてファクターアウト(関数合成、>>) というF#の目立つスタイルについてだけ それ自体は連鎖型言語(forth, postscript等)スタイルを型推論で補強したもの、と見ていい 名前の付け易さ=テキストとしてのコード片に意味を与えられるか グローバル状態へ(副)作用する演算子の併置のみで記述する連鎖型言語には、プログラムから任意に切り出したコード片も有効なプログラムとなる性質がある 一方でそのコード片の任意な繋ぎ合わせも有効(だけど多分無意味)という問題もある 関数型スタイルは状態を持つ事を避ける真逆の発想でロジックの分離を奨励するけど、柔軟な記法定義を許せば連鎖型風のテキスト上の切り出し性までエミュレートできる さらに型推論で無意味な貼り合わせの大半を防ぐ、というのが売り 関数型を極端に突き詰めれば、引数に一切言及しないポイントフリースタイルに行き着くけど これは連鎖型スタイルそのもの、唯一のグローバル状態が暗黙の引数なので言及しない 当然どちらの極端も実用的でないので、名前は付けようね 純粋なforthプログラムはコンビネータの列と見なせるし、むしろ関数型と呼んで良いのでは 括弧、というかスコープが無いのでラムダ計算との相性が悪すぎるのが難点 lispの対極 コードをフラットに書ける点に着目するならML系やHaskellの自動カリー化も忘れるな lispでもやろうと思えばできるけど、()のネストでフラットには読めないし、()を除いたら自慢の一貫性のある意味論が崩壊する vs、vscodeを使えればわざわざやることもないのですが これらが使えないので sublime text3 でF#の実行環境をつくりました パケージのインストールに手間取りました これで、エディターだけで実行までできるようになりました sublimeが動きだしましたので、これまでつくったWEBアプリのサンプルをテストしてみました ウィンドウを開いて線を表示する例、 sublimeですと動きません いろいろ試してne for,rm()をnew Form(,Visible=true)にすると動きました ところが、修正したソースをコマンドラインからfsiで動かす動きません どうなってるんでしょうかね >>182 それでなぜラムダ計算との相性が悪すぎるのか スコープって見た目の話か >>189 おれはgforthで遊んでるくらいだけど、ラムダ計算っぽく書けないという意味ならスコープのせいだろう ローカル変数(スタック){: ... :}もANSIに入りはしたけどゴミだから俺独自の{ ... }使えって始末 forth-standard.orgで議論やってるけど、ローカル関連は炎上祭りよ そもそもの言語哲学に反してるのもある 仮引数すら拡張的な位置付けなら、λの入り込む余地なんてないわな 最近独学で触り始めて面白いなーと思ってるんだけど 日本でF#の案件ってないのかな 実案件にF#ぶっ込んだけど募集案件としてはたまーに見るくらいやな この言語って"知られていない"の一点に尽きる気がする TypeScriptよりも書いていて気持ちいいと思うんだけどな MSが力入れてないのでテンプレートがないとかで使いにくいとこはあると思うけどそのほかは今でもC#より優れてるとこ多々あるとは思うよ Unityで使えるならこっち使いたいわ >>197 F# Unityでググると、日本語の記事がいくつかヒットするけどどうなんだろ。 >>198 WindowsでIL2CPP使わないなら使えるというかF#でつくったdllの呼び出しが出来るって話だと思う。 モバイルとかはもうIL2CPP前提だから無理ぽ 無理というかタイプのネストが9以下ならいけるはずなんだけどF#じゃ軽く超えるからやはり無理ぽ Unityばかり使っててF#全然触ってないんだけど、ジェネリクス使おうとするとF#の楽さが身に染みる 実務でF#使ってるっていう会社の面接受けてて好感触なんだが果たして本当に大丈夫なのだろうか……C#の経験しか無いんだが まぁあとはF#みたいな割とマイナー寄りなところの経験積んでも将来なぁみたいな。F#使ってる会社ってどれくらいあるんだろう 正直言語なんでなんでもいいしそこで関数型やら.NETやら慣れたら他にも応用効くでしょ Elixir の方が良い。 Ruby っぽくて可読性も高い スクエニでも使っているらしいし、 Ruby on Rails の本も出している、黒田努の本も出た Elixir実践ガイド、黒田努、2021/2/5 Ubuntu 20.04, Docker CE 19.03, Elixir 1.11 Phoenix, BEAM というフレームワークもある YouTube で有名な雑食系エンジニア・KENTA は、 Phoenixでポートフォリオを作った。 Railsに似ているのかも 漠∞!!!! 列∞!!!!! 廷∞!!!!!! 器∞!!!!!!! 業∞!!!!!!!! 論∞!!!!!!!!! 寿∞!!!!!!!!!! 素∞!!!!!!!!!!! >>203 だけど結局会社入った F#とC#が入り乱れるフレームワークとそれによるシステムで超苦戦してる というかF#まじで分かりにくくない?let let letでもう何が何なのか区別が本当につけにくい {}の区切りも無いから巨大な1ファイルにたくさんクラスがあったりするとどっからどこまでが1クラスなのかすらよく分からない あとそもそも学習リソースが無い。英語の本やサイトくらいしか包括的に学べない 転職先選び失敗したかなぁ……1週間で早くも落ち込んでる >>209 業務でF#使えるなんてうらやましい。 ちょっと古いけど、自分は「実践F#関数型プログラミング入門」って本で勉強したヨ。 がんばれ >>209 typeとletで普通に見分けつかん? 英語の本あれば十分なのでは…というか英語でダメならこれを機会に英語勉強しろ 翻訳するのもあり F#のベストプラクティスがよく分かってないからあれなんだけど moduleはC#でいうところのstatic classみたいなもんっていうの読んであれ?って ユーティリティクラスは良くないとか言われるけどあんまstatic classにいいイメージ無くて F#だと全然そんなことないの?ガンガンmoduleに色々突っ込んじゃえみたいな感じ? >>210 注文した >>211 いやtypeとletはそりゃ区別つくけど。関数だろうと変数だろうと条件分岐だろうと全部letじゃない あとまぁpythonもそうだけどインデントで分けるのほんと分かりにくくて。カッコが無いときつい 英語割りと得意な方だけど勉強するときはやっぱり日本語のほうが頭に入る 判別共用体がよくわかりません。例えば type Shape = | Rectangle | Circle | Prism みたいな例だと最初いやお前らどこから出てきた。そんな型ないだろと思って んじゃenumみたいに0から番号振ってるのかと思ったらそうじゃないって言うし それでいきなりlet x = Rectangleみたいな使い方が出来るなんて言われてもうちんぷんかんぷん。それでxの型はShapeだっていうし RectangleだのCircleだのは識別子って言うらしいけどこいつら一体なんなんですかね。英語サイトなんかだとコンストラクタだと思えばいいよみたいなこと書いてたけど そもそもクラス定義なのにこの内のどれかってどういうことなんですかね。例えばlet y = Circleみたいにやったときxとyの違いってなんでしょう?(参照するアドレスの話ではない) 暗黙的にprivate int typeみたいなのが生成されて番号振られてるとかなら分かるんですが 今日一日ずーっとあれこれサイト巡ってchatgptとかにもお伺い立ててそれでも全然理解できませんでした 大体どの本も最初でさらっと流してるけどどうしてみんな理解できるんですか?自分の理解力の低さに悲しくなってきました >>213 オブジェクト指向でのクラス・サブクラス関係のようなものと考えればいいんじゃないか? RectangleクラスやCircleクラスのインスタンスはShapeとして扱える、みたいな話の関数型の考え方での表現方法 自分は理解に困ったことなかったんで新しい知見だけど 背景知識でどう書き換えられるかを調べてみたらどうだろう。 その感じだとC#とかJavaとかのオブジェクト志向言語は使えるんでしょ ~言語で書いてみる、とかでググってみたらどうかな 番号振られてるのとコンストラクタ(≒クラス)で識別できるのはあまり変わらない気がするけども xとyの違いは値の違いだと思うよ どちらもShapeクラスのインスタンス C#で書くなら、Shapeクラスがpublic static readonly Shape Circle = new Shape(ShapeId.Circle)ってなやつを持ってれば、だいたい同じになりそうじゃん? これならprivate int ShapeIdで区別してるって考えられるけど。 CircleとRectangleの区別のために、実際にどう実装されてるか気にしなくてもいいと思うけどね >>213 > そもそもクラス定義なのにこの内のどれかってどういうことなんですかね。 どういうことっていうか、そもそもクラス定義じゃないので。 無理やりオブジェクト指向に当てはめるとすると、 null許容型みたいに複数の選択肢を与える型とレコード型を融合させたものと考えたらいいんじゃないですかね。 ただ例え話にも限界が有るし、素直に頭を関数型言語にシフトさせた方がいいと思います。 >>213 その例だとRectangle、Circle、Prismは中身がないから 単なる番号と考えることもできるだろうけど 中身がある場合はそうもいかないでしょ learn.microsoft.com/ja-jp/dotnet/fsharp/language-reference/discriminated-unions Haskellにも同様のものがあるし www.letitride.jp/entry/2020/05/05/092738 Scalaにも同様のものがある zenn.dev/mossan_hoshi/articles/20230417_scala ScalaではF#のinterfaceのようなものであるtraitと こうした目的のための特別なclass定義 case classがあり CircleやRectangleの定義でShapeを継承している >>214 >>217 あれちょっと衝撃的だったんですけどクラス定義ですよね?typeだし あーちょっと思いついて判別共用体をDLLにしてC#で呼び出して定義に移動したらC#で判別共用体がどう解釈されるかは分かりました sealed class Shape の中にstatic class Tagsが定義されてint Rectangle = 0, int Circle = 1みたいに番号振られてますね。考え方としては間違ってなかったのかな…… returnが無いの本当にきついと思うんですけど慣れますか 最後まで関数読んでもそもそも何を返しているのかさえ分からないのが日常茶飯事なんですけど if condition then xxx, true else...みたいなのがあっては?true?なんじゃこの構文と思って散々検索した後にxxxとtrueのタプルを返してるとchatgpt先生に教えてもらったときは無理だろってなりました 書かれているとおりのものが返るだけなのにreturnがあるはず(あるべき)という 思い込みのせいで分からなくなってるわけで、returnがあるはず(あるべき)という 思い込みはいつか消えますかと問われても、人によるだろと答えるしかないな 確かにオブジェクト指向とは違う表現が多いだろうけど、それ以上に面白いと思うけどなあ 特にCopilotとの相性が良すぎる コンピュテーション式まじでわかんねぇ…… let!とかdo!とか解説をいくら読んでも理解できん。デバッグでステップごとにやってるとlet!の次の行実行しないでいきなり波括弧終わったりするのなんでや コンピュテーション式の名前をはじめて知った初心者だけどステップインで実行したら1行ずつ動いて、 この記事のコメントで書いてるイメージのコールバックの動きが実感できた ttps://zenn.dev/zecl/articles/a330820e9277cf#option%E3%83%A2%E3%83%8A%E3%83%89%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%BC%8F 中身がコールバックだからかデバッガが上手いこと判断してくれないんかな。 コンピュテーション式まじで難しい 大体公式のhttps://learn.microsoft.com/ja-jp/dotnet/fsharp/language-reference/computation-expressions これはなんだ。理解できる人間が存在するのか 記事とか読んでてもこういう風に自動的に変換できるんだよ簡単だねみたいな書き方してるけど変換先がもうわけわからん これを頭の中で想像できない人間は書けないのか いろんなものを1つのシンプルな手法で表現できる仕組みなので、公式の説明にあるように抽象化された難しい概念なのでは シンプルというのが簡単ではなくて、難しいというのは数学とかはよくあるよね 公式ではうそや矛盾する喩えを出さないように説明するから、 一面を単純化して喩えてるような、複数の外部の記事を自分の中で抽象化することで理解が進むんじゃないかな 直ぐに仕組みを理解しなくても良いんでは? 仕組みを理解しなくてもある程度は使えるでしょ。 難しく考えすぎな気がする。 関数と変数と条件分岐が全部letだって、評価して何かしら結果が得られるものって思えば、全部同じでも困らないし。 俺もそのマイクロソフトのサイトだけではさっぱり理解不能だと思う コンピュテーション式はhaskellのdo記法を真似たものだから わからなかったらそっちを勉強するのがいいかもしれない bindの型をみて、bindがチェーンにする様子がイメージできたら なぜ展開するとああいういかつい式になるのかが理解できてくるよ Haskellとかもそうだけどシンタックスシュガーの元の構文は複雑すぎるので 元の構文までしっかり理解して書けるようにするべきなのか? というのは意見分かれるだろうな 使い方だけ覚えれば手続き言語のように使えるわけだし f#の書き方Copilotに質問したらあっさり解決した geminiは全然駄目だねコンパイル通らなかった 既に三か月もF#の記事がない公式ブログかな https://devblogs.microsoft.com/dotnet/tag/f/ 最近ずっとAIとクラウドの話しかされてない 公式ブログかissue ブログはもはやAIとクラウドの話しかしてない・・・ コミュニティベースで頑張るよって言ってるし、あまり書くこともないのかも? read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる