【.NET】F#について語れ2【OCAML】
レス数が1000を超えています。これ以上書き込みはできません。
>>882
諸事情で3。3.3.0.1あたりかな。 実践F# 関数型プログラミング入門 読んでると
リストに気合入ってるんだけど
リストってLIFOじゃないですか
リストのコレクションとしての意味とかループとしての意味は分かるんですけど
LIFOの性質をこれまであんま使った記憶が無くて
その意味合いが分かんないんですよ
自分の中ではFIFOの方が使い勝手よさそうなのに、
あえてLIFOで実装された理由というかメリットが知りたいッス 由来は知らんけど、追加は効率いいよね。
パターンマッチもいいかなと思ったけどそれは配列なら似たようなもんか。 immutableなFIFOリストの実装が非効率的だからでは
FIFOを効率的に実装するためにはリスト末尾と先頭への参照を持つ必要があって
複数箇所から参照されてる場合にそれぞれを破壊的変更する必要がありそう 事前に断っておくと、F#ではプログラミング初心者というか、つい先日からです
>>887 >>888
うん。なんとなくだけど実装上のメリットなら分からないでもないんだけど
結果として使いづらくなるのなら言語としてどうかなと
ちなみに、リストとかどういうケースで使ってますか?
やっぱ、あまり使わないですか? >>889
いや基本リスト使うけど。
中グルングルン回して何かする奴は配列の方が早いので必要な時は配列にする。 コレクション、そも順序気にしないものも多いし。順序が必要な時は適宜rev入れたりして気を配ったりする必要はある。 >>890 >>891
おおっ Thx
なんとなく、納得しました 差し当たって気にし過ぎたのかなw
やっぱ、最初のうちは とにかく書くだね >>886
自己レスなんだけど リストがLIFOの理由が分かった
結構単純な理由なんだけど
F#を含む関数型の場合、データー構造も再帰で表現できるんだけど
リストも再帰で表現されているため、LIFOにしか出来ない
マトリョーシカで例えると、最初のデータが一番小さいマトリョーシカしかで、
追加する度に大きなマトリョーシカに包含となる
結果として、データを取り出す際には大きなまとりょから取り出すことになり、LIFOにしかならないと
Haskellの本読んでて気づいた ちなみに、すごいH本読むと配列って記述無いんだよね
関数型と配列は相性が悪いらしい 不変じゃないしね
Haskellの配列はモナドらしい さらにO(1)でないらしい 純粋だね〜 Lisp から入る人が多いから、自明だと思われているのでは? 演算子の優先順位(↓の一番下にある)の見方なんだけど
https://msdn.microsoft.com/ja-jp/library/dd233228(v=vs.120).aspx
| (パイプ) は|>のこと
f x (関数適用) は関数fの引数の割り当て f 1+2は (f 1)+2という意味
f(x) は.Netの関数の適用
でOKですか?
あと、関数の合成(>>)に関する規定が無いように見えるんですけど、どれに対応しますか? なんのこと言ってるのかなと思ったけど
>>895のリンクの最上部を見るんだ 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
C6RTQ vs2017 communityでwpf/xamlでエラーが出る
未対応なのか? >>893
Haskellの場合、リストを2つ使ってFIFOに変換する
1つはFIFOに変換したリスト もう一つは蓄えようのリスト
FIFOのデータが欲しかったら、蓄え用のリストからデータを順次取り出しFIFO用のリストに保存
FIFO用のリストを使い切ったら、また、蓄えようのリストからFIFOのリストに変換
つまり、裏(LIFO)の裏は表(FIFO) って使い方 さしあたって、MSがF#を忘れていなかったのがうれしいw
Haskell勉強中 now Match!は地味にいいな
後将来的な予定の匿名レコードはC#の匿名クラス的な使い方でそれがメソッド内超えて使えるようになる感じか? MSの割にはアンチが少ないよな
相手にされてないとも >>863>>864
Scalaのスレはなくなりここは残った scalaが思ったより早く廃れたのはそれこそjavaの混乱のせいか
いやもっと前?
F#はなんだかんでMSが見捨ててないからな〜 Scalaは流行り廃り激しいWeb系としてもてはやされたから急におとなしくなった感はある
今は固定層だけ使ってるんじゃね
F#は特に流行ってないから廃れた感じもないw 俺は、Haskellずーーーーと勉強してる
一見わかりやすそうな文法なんだけど、難しいな これ
ただ、知識欲は満たされる 正直C#に公式でOptionとEitherと末尾再帰最適化と諸々のイミュータブルなデータ構造周りを入れてくれればもうそれでいいや ほんそれ
テイルコールはいいから、せめてネスト型数の制限だけなんとかなってくれればなぁ 書き込みあったと思ったらF#の話じゃなくてC#の話じゃんw 言語進化ペースも遅いからな
けど今度の匿名レコード型は期待してる そもそもMS組の中で勝ち負けを考える言語だったとは驚きだ まあC#8.0でまだ2.0にすら追いつけてないからな ぐぐるとブログの先生方のありがたい記事はアウトデイト過ぎて
qiitaに負けとる… https://qiita.com/cannorin/items/59d79cc9a3b64c761cd4
この人 GNU/Linux でしか F# 書いたことないとかまじか
なんでF#なんて使ってんだろ?まったく伝わらんw いやそこになんでF#がいいか書いてるやんけ…
いろんな言語のいいとこ取り含め何が分からないんだ 最初から見捨てられてたからそれよりはマシになった感じ 関数型言語が流行るときは果たして来るのかな?
2010年くらいまでは、cpuとgpuがまもなく統合されて、命令的でなく、宣言的にかける関数型言語でかくことでプログラムの並列化が自動的になされる時代が来るとかいう謳い文句をよく耳にした。
でも現実は関数型言語で並列プログラミングをしている人は少なくて、directx12とかvulkanの登場に象徴されるように、並列化したければ、寧ろもっと命令的でstate machineを操作するようなスタイルが主流になってしまった。 いやDirectX とか引き合いに出されても、それが普通の並列のケースかいったらちがくね? コンピュテーション式を使って、async{}の内部では文を特別に解釈することで、簡単に非同期処理をすることができるというのはF#の優れた点だと思う。
けれど、AsyncなんかはC#とか色々な言語に取り込まれつつある。
折角頑張って本を読んで、F#を使ってはみたが、クラスを作らなくてよい、代数的演算ができるようになったC#という程度の使い方しかできない。
コンピュテーション式は俺には使いこなせる気がしない。プログラミング言語を使うことそれ自体が目的みたいな人なら使えるかもしれないが。このスレッドをざっと見てみたけれど、殆どのF#でコンピュテーション式とかそういう機能使う人いないんじゃないかな。 結局俺が言いたいのは、2010年くらいまでによく聞いた関数型言語の宣伝文句は大げさ過ぎだったということだ。 >>949
普通のケースではないけれど、当時はゲームエンジンの制作者までもが関数型言語に期待しているような記事があったんだよ。ゲームにまでも関数型言語か! これは関数型言語をやらざるを得ないな!って思ったことを覚えている。
https://game.watch.impress.co.jp/docs/20080911/epic.htm よく分からないんだが、自分が使いこなせない?のかよく分からなかったという理由で誰も使ってないと思うのはなんなの?
WEBでもReactとかまさに関数型の考えでできてるしElmはピュアだし、いろんな言語に関数型の要素取り入れられてる
シェーダーとかまさに関数だし、ゆにていのECSとかオブジェクト指向で色々効率悪かったから値の配列を元に処理するぜって話だし、Rx系もいろんなところに移植されてる。
むしろ色んなところで関数型の考えで応用されてると思うけど。 >>948
・ユーザーは同じ操作をすれば同じ結果が返ってくるソフトを求めてる(ある種の参照透明性のあるソフトを求めてると言える)
・しかし手続き型言語は参照透明性が保たれない。
この時点で論理矛盾は有るんだけど、流行らないでしょうね。。。ー>関数型言語 >>952
覚えてますよー。
恐らく並列用のライブラリ充実で手続き型言語で良いやってなったんでしょうね。
シングルスレッドは手続き型言語優位ですし、並列ライブラリ揃えばパフォーマンスは手続き型言語に軍配上がりますから。 ちなみにHaskellは純粋関数型言語という事で並列に向くのではと思われましたが、純粋さの為に遅延評価だったのが災いしてます。
(遅延評価が並列動作を徹底的に邪魔をする)
実用的には金融系で採用されたOCamlのように純粋でない関数型言語の方が並列に向いているようです。
(並列プログラミングでよく名前の上がるErlangも純粋じゃないですよね) 俺純粋なんだけど、あの子は振り向いてくれない
みたいなもんか >>959
純粋男子はモテないからな
ジェントルよりワイルドに
ワイルドよりデンジャラスよ Haskellが遅延デフォなのは副作用を外に持ってた関係?
その辺よく知らんけど純粋と遅延は一体じゃないでしょ
関数型はパフォーマンスではそりゃゴリゴリメモリ書き換えるやつの方が速いかも知れんが、そりゃメンテ性とか色々一切無視したあまりにも乱暴な議論じゃねーの。
重ねていうけどいろんな言語に関数型の概念は染み渡ってて、それで関数型が流行らないとか言われてもむしろすでに乗っ取られてはしませんかって感じしかしないわ。
そもそも関数型も手続き型も各々得手不得手あるんだからどっちが勝った負けたの話じゃない 質問です。2重ループ内で関数Fを呼び出して処理をしようとしているのですが、これをreduceなどを使って簡潔に表現する方法はありますか?
for i in seq1 do
for j in seq 2 do
F(i,j) 先ほどの訂正:
seq1は2次元のコレクションでseq1の各要素を引数にしてとある関数Fを呼び出すということをやりたい。
for i in seq1 do
for j in seq1.[i] do
F(seq1.[i].[j]) Haskellしか知らんけど、関数型言語である以上似たようなものがあるはずなので。。。
1・main =print $ [map f (lst!!y) | y <- [0..length lst - 1]
lst = [[1,2,3],[4,5,6]]
f = (+1)
2・main =print $ map (map f) lst
lst = [[1,2,3],[4,5,6]]
f = (+1) >>963
seq1|>Seq.collect id|>Seq.iter F
のことでいいのかの? let f = printfn "%d"
let l = [[1;2;3]; [4;5;6]]
let kk = List.collect id l |> List.map f >>964
Haskellなのでよくわからない部分もありますが、
map f (lst!!y)が1つ目のforループの代わりになって
(lst!!y) | y <- [0..length lst - 1]が2つ目のループの代わりになる感じだと理解しました。
>>965
Seq.collect idを使って2次元を1次元に並べ直すんですね。
ありがとうございました。関数型言語は難しいです。
私には、forループの方が分かり易く思えてしまうのですが、皆さんは副作用のない場面ではforよりcollectとかmapを使う感じですか? 気分かなー
上からパイプライン演算子で繋がってない時はiterの代わりにfor使うことも >>969
うい。
Haskellのlst!!yは普通の言語のlst[y]に置き換えてくれれば。
リスト内包表記でも作れそうだと作ってみましたが、
普段インデックスなんて意識しなかったから、ちょっと悩みました。
最初、こう書いてみたら2次元から1次元になったので違うな。。。と。
(全部に適用するのは同じですが、リスト(配列)の構造(次元)が違ってしまう)
[f (lst!!y!!x) | x <- [0..(length.head) lst - 1], y <- [0..length lst - 1]]
結局map (map f) lstが一番簡潔でしたが。 F#良く知らないけど内包表記で
[ for xs in xss do
for x in xs -> f(x)]
みたく書けないん? >>970
変に関数型にこだわるより簡潔に書ける方を使うということですね。 >>971
lst!!y!!xでコレクションの形を表してxやyに対しての操作を記述しているってことですか?
このような記述はF#でできるのかな。。。
>>972
質問の仕方が曖昧だったかな。リストを生成するのでなくて、コレクションの各要素に対して関数を適用して副作用を得るのが目的。で、それをforみたいなループを使わずに書けないかという質問でした。 >>974
あんまり難しく考えなくて良いですよ^^;
リスト内包表記でxとyの全ての組み合わせが小さい順で出るので、それをインデックスに使ってるだけです。
F#にもあると思いますよ。
1次元になって良いなら、
(map f.concat) lst
が簡潔でしょう。
>>965-966 のcollect id がちょうどconcatと同じ事してます。 Microsoft makes F# 4.6 and F# tools for Visual Studio 2019 generally available プログラム板にキチガイ降臨中!botに一晩も反応する異常さ
一般人(学校恩師)に殺害予告をしているのでスレ建て通報してください。
https://mevius.5ch.net/test/read.cgi/tech/1559872586/
142 名前:a4 ◆700L1Efzuv 投稿日:2019/06/18(火) 05:29:55 ID://qVkzO
>>141
名古屋の人な 俺ね、君の問題を大橋先生と混ぜないことにする。つまりね、
片桐孝洋のことをボコろうと思う。普通に顎の骨を折る。これくらいで警察来るか?
一般市民とかさ、普通にさ、俺らの秘密なんだけどさ、日本人なんて復活ねーから。 F#の公式リファレンス
たとえばList.splitAtが
左側のメニューにはあるけど一覧表のほうには無かったり
色々不備がある、コアライブラリの漏れの無い完全なリファレンスってどうやったら得られる?
https://msdn.microsoft.com/visualfsharpdocs/conceptual/collections.list-module-[fsharp] バージョンアップされたり
パッチ出るたびに
毎回ソース見直すのか
ご苦労さん >>982
公式ドキュメントの漏れや不備がないか心配って言ってるんだからそれしかないだろう
バージョンアップの度にソース見直すとかってのはお前が勝手に言いだしてることだから俺には意味がわからん >>979
公式リファレンスがいろいろ不備があって不便、でよかった
どうやって得られるとか変に前向きな姿勢見せたからこのありさま
スキ見せたらあかんで! スレたて以降8年もたってるのに全然流行ってる気配ないぞ まあはやってはないしな実際
C#なんかより遥かにマシなんだけどね C#とF#で「F#のほうがマシ」と言われる理由が分からん。
C#とF#が違う点って「書き方」だけだよね(どちらもCLIに落とされたら同じ)。
書き方で「マシ」「マシじゃないない」の議論するってもはや言語関係ないじゃん。 インライン強制あたりはC#では実現できないILの産み方するんでは?
あとは単位つけれるアレとか。コンパイル時後は消えるけど、書き方の問題だけではなくて実際にコンパイルエラーを起こしてくれる賢い機能だと思うけど。
あとなんだろ。スタックに変数確保がとても楽とかかな。最近やっとc#でも出来るようになったけど、まだまだ不便よね。 >>990
言語が違うからマシな書き方が出来るんだが…
>>991
スタックにおくってなんの話だっけ? >C#とF#が違う点って「書き方」だけだよね(どちらもCLIに落とされたら同じ)。
機械語になったら同じ(少なくとも同じCPUで実行してれば)だから
PHP の方が Ruby よりましだな >>992
キャプチャされないlet mutableはスタック上に確保される >>996
その辺書かれてるドキュメントとかある?
ローカルでレコードやユニオンをただ値に束縛してるやつとかもそうなんか? >>990
でもC#の代替及びすみ分け、でしかF#の生きる道はないし
それで生き残れているだろう
Slot
🎴👻👻
🎰💣🌸
🌸🍒🎰
(LA: 0.90, 0.83, 0.75)
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 3037日 2時間 35分 8秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。