X



【.NET】F#について語れ2【OCAML】
レス数が950を超えています。1000を超えると書き込みができなくなります。
0886デフォルトの名無しさん垢版2018/02/19(月) 10:01:13.69ID:p8AEqh0V
実践F# 関数型プログラミング入門 読んでると
リストに気合入ってるんだけど
リストってLIFOじゃないですか

リストのコレクションとしての意味とかループとしての意味は分かるんですけど
LIFOの性質をこれまであんま使った記憶が無くて
その意味合いが分かんないんですよ
自分の中ではFIFOの方が使い勝手よさそうなのに、
あえてLIFOで実装された理由というかメリットが知りたいッス
0887デフォルトの名無しさん垢版2018/02/19(月) 12:04:06.23ID:nacKNyKE
由来は知らんけど、追加は効率いいよね。
パターンマッチもいいかなと思ったけどそれは配列なら似たようなもんか。
0888デフォルトの名無しさん垢版2018/02/19(月) 12:15:27.34ID:SrM6uAzC
immutableなFIFOリストの実装が非効率的だからでは
FIFOを効率的に実装するためにはリスト末尾と先頭への参照を持つ必要があって
複数箇所から参照されてる場合にそれぞれを破壊的変更する必要がありそう
0889886垢版2018/02/19(月) 14:39:39.10ID:p8AEqh0V
事前に断っておくと、F#ではプログラミング初心者というか、つい先日からです

>>887 >>888
うん。なんとなくだけど実装上のメリットなら分からないでもないんだけど
結果として使いづらくなるのなら言語としてどうかなと

ちなみに、リストとかどういうケースで使ってますか?
やっぱ、あまり使わないですか?
0890デフォルトの名無しさん垢版2018/02/19(月) 14:55:29.81ID:L6jTtzQk
>>889
いや基本リスト使うけど。
中グルングルン回して何かする奴は配列の方が早いので必要な時は配列にする。
0891デフォルトの名無しさん垢版2018/02/19(月) 14:57:01.82ID:L6jTtzQk
コレクション、そも順序気にしないものも多いし。順序が必要な時は適宜rev入れたりして気を配ったりする必要はある。
0892デフォルトの名無しさん垢版2018/02/19(月) 15:22:05.36ID:p8AEqh0V
>>890 >>891
おおっ Thx

なんとなく、納得しました 差し当たって気にし過ぎたのかなw
やっぱ、最初のうちは とにかく書くだね
0893デフォルトの名無しさん垢版2018/03/02(金) 22:08:36.41ID:mYNfwuMl
>>886
自己レスなんだけど リストがLIFOの理由が分かった
結構単純な理由なんだけど

F#を含む関数型の場合、データー構造も再帰で表現できるんだけど
リストも再帰で表現されているため、LIFOにしか出来ない
マトリョーシカで例えると、最初のデータが一番小さいマトリョーシカしかで、
追加する度に大きなマトリョーシカに包含となる
結果として、データを取り出す際には大きなまとりょから取り出すことになり、LIFOにしかならないと

Haskellの本読んでて気づいた ちなみに、すごいH本読むと配列って記述無いんだよね
関数型と配列は相性が悪いらしい 不変じゃないしね 
Haskellの配列はモナドらしい さらにO(1)でないらしい 純粋だね〜
0895デフォルトの名無しさん垢版2018/03/04(日) 11:45:52.08ID:1R6Vs5gf
演算子の優先順位(↓の一番下にある)の見方なんだけど
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ですか?
あと、関数の合成(>>)に関する規定が無いように見えるんですけど、どれに対応しますか?
0900デフォルトの名無しさん垢版2018/05/23(水) 20:50:11.72ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

C6RTQ
0904デフォルトの名無しさん垢版2018/06/27(水) 14:52:41.49ID:RqcpnlVd
>>893
Haskellの場合、リストを2つ使ってFIFOに変換する
1つはFIFOに変換したリスト もう一つは蓄えようのリスト

FIFOのデータが欲しかったら、蓄え用のリストからデータを順次取り出しFIFO用のリストに保存
FIFO用のリストを使い切ったら、また、蓄えようのリストからFIFOのリストに変換

つまり、裏(LIFO)の裏は表(FIFO) って使い方
0905デフォルトの名無しさん垢版2018/07/05(木) 01:03:00.33ID:RfoszcD2
14X
0914デフォルトの名無しさん垢版2018/08/19(日) 20:53:38.44ID:coCwFxQi
Match!は地味にいいな
後将来的な予定の匿名レコードはC#の匿名クラス的な使い方でそれがメソッド内超えて使えるようになる感じか?
0916デフォルトの名無しさん垢版2018/09/26(水) 12:04:36.29ID:kWlYqESN
忘れてないだけなのに小成功w
0919デフォルトの名無しさん垢版2019/01/18(金) 04:12:05.97ID:6U5tZjv3
scalaのスレもうないのかω
0921デフォルトの名無しさん垢版2019/01/18(金) 15:37:52.09ID:mkL07vHv
scalaが思ったより早く廃れたのはそれこそjavaの混乱のせいか
いやもっと前?
F#はなんだかんでMSが見捨ててないからな〜
0922デフォルトの名無しさん垢版2019/01/18(金) 15:42:40.48ID:tGJC1q7w
wrapperな時点で負け
0924デフォルトの名無しさん垢版2019/01/18(金) 19:31:06.14ID:wcIBYenX
Scalaの方がユーザーは多そうなのに
0925デフォルトの名無しさん垢版2019/01/22(火) 19:29:00.13ID:Rmc/4N6W
Scalaは流行り廃り激しいWeb系としてもてはやされたから急におとなしくなった感はある
今は固定層だけ使ってるんじゃね
F#は特に流行ってないから廃れた感じもないw
0926デフォルトの名無しさん垢版2019/01/22(火) 20:28:14.94ID:6RrYW1UH
俺は、Haskellずーーーーと勉強してる
一見わかりやすそうな文法なんだけど、難しいな これ
ただ、知識欲は満たされる
0928デフォルトの名無しさん垢版2019/01/24(木) 11:11:58.11ID:Y31ePpdj
こないだ見くびられてる言語5つに入ってたな
0930デフォルトの名無しさん垢版2019/01/26(土) 21:42:56.42ID:+eApZUOf
正直C#に公式でOptionとEitherと末尾再帰最適化と諸々のイミュータブルなデータ構造周りを入れてくれればもうそれでいいや
0931デフォルトの名無しさん垢版2019/01/26(土) 23:53:52.86ID:V+pxBIbs
型推論つかない限りC#クソって言い続けるわ
0933デフォルトの名無しさん垢版2019/01/27(日) 00:47:38.92ID:eERlvW+o
ほんそれ
テイルコールはいいから、せめてネスト型数の制限だけなんとかなってくれればなぁ
0935デフォルトの名無しさん垢版2019/02/02(土) 12:45:41.79ID:5KhxZqJM
言語進化ペースも遅いからな
けど今度の匿名レコード型は期待してる
0943デフォルトの名無しさん垢版2019/03/05(火) 08:03:17.17ID:CS3QY3w6
いやそこになんでF#がいいか書いてるやんけ…
いろんな言語のいいとこ取り含め何が分からないんだ
0944デフォルトの名無しさん垢版2019/03/05(火) 10:44:15.42ID:HwCl8Q1J
exeゲロるんだっけ
0946デフォルトの名無しさん垢版2019/03/08(金) 22:22:16.47ID:AvJAJo7K
最初から見捨てられてたからそれよりはマシになった感じ
0947デフォルトの名無しさん垢版2019/03/09(土) 07:49:19.81ID:ZOfzHyh2
G♭の方がカッコイイ
0948デフォルトの名無しさん垢版2019/03/23(土) 00:41:02.20ID:hURiHGZc
関数型言語が流行るときは果たして来るのかな?

2010年くらいまでは、cpuとgpuがまもなく統合されて、命令的でなく、宣言的にかける関数型言語でかくことでプログラムの並列化が自動的になされる時代が来るとかいう謳い文句をよく耳にした。

でも現実は関数型言語で並列プログラミングをしている人は少なくて、directx12とかvulkanの登場に象徴されるように、並列化したければ、寧ろもっと命令的でstate machineを操作するようなスタイルが主流になってしまった。
0949デフォルトの名無しさん垢版2019/03/23(土) 00:54:03.50ID:ZwxIeQAv
いやDirectX とか引き合いに出されても、それが普通の並列のケースかいったらちがくね?
0950デフォルトの名無しさん垢版2019/03/23(土) 00:54:13.93ID:hURiHGZc
コンピュテーション式を使って、async{}の内部では文を特別に解釈することで、簡単に非同期処理をすることができるというのはF#の優れた点だと思う。
けれど、AsyncなんかはC#とか色々な言語に取り込まれつつある。

折角頑張って本を読んで、F#を使ってはみたが、クラスを作らなくてよい、代数的演算ができるようになったC#という程度の使い方しかできない。

コンピュテーション式は俺には使いこなせる気がしない。プログラミング言語を使うことそれ自体が目的みたいな人なら使えるかもしれないが。このスレッドをざっと見てみたけれど、殆どのF#でコンピュテーション式とかそういう機能使う人いないんじゃないかな。
0951デフォルトの名無しさん垢版2019/03/23(土) 00:59:32.27ID:hURiHGZc
結局俺が言いたいのは、2010年くらいまでによく聞いた関数型言語の宣伝文句は大げさ過ぎだったということだ。
0952デフォルトの名無しさん垢版2019/03/23(土) 01:06:26.22ID:hURiHGZc
>>949
普通のケースではないけれど、当時はゲームエンジンの制作者までもが関数型言語に期待しているような記事があったんだよ。ゲームにまでも関数型言語か! これは関数型言語をやらざるを得ないな!って思ったことを覚えている。
https://game.watch.impress.co.jp/docs/20080911/epic.htm
0953デフォルトの名無しさん垢版2019/03/23(土) 01:21:43.24ID:ZwxIeQAv
よく分からないんだが、自分が使いこなせない?のかよく分からなかったという理由で誰も使ってないと思うのはなんなの?
WEBでもReactとかまさに関数型の考えでできてるしElmはピュアだし、いろんな言語に関数型の要素取り入れられてる
シェーダーとかまさに関数だし、ゆにていのECSとかオブジェクト指向で色々効率悪かったから値の配列を元に処理するぜって話だし、Rx系もいろんなところに移植されてる。
むしろ色んなところで関数型の考えで応用されてると思うけど。
0955デフォルトの名無しさん垢版2019/03/23(土) 04:56:56.13ID:abrpiqJH
>>948
・ユーザーは同じ操作をすれば同じ結果が返ってくるソフトを求めてる(ある種の参照透明性のあるソフトを求めてると言える)

・しかし手続き型言語は参照透明性が保たれない。

この時点で論理矛盾は有るんだけど、流行らないでしょうね。。。ー>関数型言語
0956デフォルトの名無しさん垢版2019/03/23(土) 05:05:32.95ID:abrpiqJH
>>952
覚えてますよー。
恐らく並列用のライブラリ充実で手続き型言語で良いやってなったんでしょうね。
シングルスレッドは手続き型言語優位ですし、並列ライブラリ揃えばパフォーマンスは手続き型言語に軍配上がりますから。
0957デフォルトの名無しさん垢版2019/03/23(土) 05:11:15.99ID:abrpiqJH
ちなみにHaskellは純粋関数型言語という事で並列に向くのではと思われましたが、純粋さの為に遅延評価だったのが災いしてます。
(遅延評価が並列動作を徹底的に邪魔をする)

実用的には金融系で採用されたOCamlのように純粋でない関数型言語の方が並列に向いているようです。
(並列プログラミングでよく名前の上がるErlangも純粋じゃないですよね)
0961デフォルトの名無しさん垢版2019/03/23(土) 14:19:44.65ID:ZwxIeQAv
Haskellが遅延デフォなのは副作用を外に持ってた関係?
その辺よく知らんけど純粋と遅延は一体じゃないでしょ
関数型はパフォーマンスではそりゃゴリゴリメモリ書き換えるやつの方が速いかも知れんが、そりゃメンテ性とか色々一切無視したあまりにも乱暴な議論じゃねーの。

重ねていうけどいろんな言語に関数型の概念は染み渡ってて、それで関数型が流行らないとか言われてもむしろすでに乗っ取られてはしませんかって感じしかしないわ。

そもそも関数型も手続き型も各々得手不得手あるんだからどっちが勝った負けたの話じゃない
0962デフォルトの名無しさん垢版2019/03/24(日) 22:48:09.05ID:cXiULMz0
質問です。2重ループ内で関数Fを呼び出して処理をしようとしているのですが、これをreduceなどを使って簡潔に表現する方法はありますか?

for i in seq1 do
for j in seq 2 do
F(i,j)
0963デフォルトの名無しさん垢版2019/03/24(日) 22:56:58.91ID:cXiULMz0
先ほどの訂正:
seq1は2次元のコレクションでseq1の各要素を引数にしてとある関数Fを呼び出すということをやりたい。


for i in seq1 do
for j in seq1.[i] do
F(seq1.[i].[j])
0964デフォルトの名無しさん垢版2019/03/25(月) 01:12:57.65ID:25q5twYk
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)
0965デフォルトの名無しさん垢版2019/03/25(月) 08:28:31.79ID:X7DYSSdE
>>963
seq1|>Seq.collect id|>Seq.iter F
のことでいいのかの?
0968デフォルトの名無しさん垢版2019/03/25(月) 13:16:59.54ID:kfX9OJI5
いやmapしたいのだったらそっちで正解かと
0969昨日質問したものです垢版2019/03/25(月) 22:24:43.80ID:8XT7Qy8P
>>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を使う感じですか?
0970デフォルトの名無しさん垢版2019/03/25(月) 22:50:11.46ID:X7DYSSdE
気分かなー
上からパイプライン演算子で繋がってない時はiterの代わりにfor使うことも
0971デフォルトの名無しさん垢版2019/03/25(月) 23:12:16.99ID:25q5twYk
>>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が一番簡潔でしたが。
0973デフォルトの名無しさん垢版2019/03/25(月) 23:33:50.20ID:tiUbxLb+
>>970
変に関数型にこだわるより簡潔に書ける方を使うということですね。
0974デフォルトの名無しさん垢版2019/03/25(月) 23:44:59.82ID:tiUbxLb+
>>971
lst!!y!!xでコレクションの形を表してxやyに対しての操作を記述しているってことですか?
このような記述はF#でできるのかな。。。


>>972
質問の仕方が曖昧だったかな。リストを生成するのでなくて、コレクションの各要素に対して関数を適用して副作用を得るのが目的。で、それをforみたいなループを使わずに書けないかという質問でした。
0975デフォルトの名無しさん垢版2019/03/25(月) 23:55:50.61ID:25q5twYk
>>974
あんまり難しく考えなくて良いですよ^^;
リスト内包表記でxとyの全ての組み合わせが小さい順で出るので、それをインデックスに使ってるだけです。
F#にもあると思いますよ。

1次元になって良いなら、

(map f.concat) lst

が簡潔でしょう。

>>965-966 のcollect id がちょうどconcatと同じ事してます。
0976デフォルトの名無しさん垢版2019/03/25(月) 23:57:10.44ID:X7DYSSdE
>>974
オペレーター書けば出来るとおも
0978デフォルトの名無しさん垢版2019/06/18(火) 06:24:44.70ID:3nOE2mBA
プログラム板にキチガイ降臨中!botに一晩も反応する異常さ
一般人(学校恩師)に殺害予告をしているのでスレ建て通報してください。
https://mevius.5ch.net/test/read.cgi/tech/1559872586/

142 名前:a4 ◆700L1Efzuv 投稿日:2019/06/18(火) 05:29:55 ID://qVkzO
>>141
名古屋の人な 俺ね、君の問題を大橋先生と混ぜないことにする。つまりね、
片桐孝洋のことをボコろうと思う。普通に顎の骨を折る。これくらいで警察来るか?
一般市民とかさ、普通にさ、俺らの秘密なんだけどさ、日本人なんて復活ねーから。
0979デフォルトの名無しさん垢版2019/07/09(火) 22:26:17.25ID:kWuXjUR9
F#の公式リファレンス
たとえばList.splitAtが
左側のメニューにはあるけど一覧表のほうには無かったり
色々不備がある、コアライブラリの漏れの無い完全なリファレンスってどうやったら得られる?

https://msdn.microsoft.com/visualfsharpdocs/conceptual/collections.list-module-[fsharp]
0981デフォルトの名無しさん垢版2019/07/10(水) 07:48:30.66ID:EfQjHn3o
>>979
インテリセンス?
0982デフォルトの名無しさん垢版2019/07/10(水) 10:27:08.20ID:+uFplCdI
バージョンアップされたり
パッチ出るたびに
毎回ソース見直すのか
ご苦労さん
0983デフォルトの名無しさん垢版2019/07/10(水) 14:49:37.18ID:EZXNCWT9
>>982
公式ドキュメントの漏れや不備がないか心配って言ってるんだからそれしかないだろう
バージョンアップの度にソース見直すとかってのはお前が勝手に言いだしてることだから俺には意味がわからん
0984デフォルトの名無しさん垢版2019/07/13(土) 03:11:40.87ID:zvKgDhky
>>979
公式リファレンスがいろいろ不備があって不便、でよかった
どうやって得られるとか変に前向きな姿勢見せたからこのありさま
スキ見せたらあかんで!
レス数が950を超えています。1000を超えると書き込みができなくなります。

ニューススポーツなんでも実況