<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>tk3++</title><link>/</link><description>Recent blog posts on tk3++</description><generator>Hugo (https://gohugo.io)</generator><language>ja-JP</language><managingEditor/><webMaster/><lastBuildDate>Wed, 06 May 2026 21:22:38 +0900</lastBuildDate><atom:link href="/tags/fsharp/index.xml" rel="self" type="application/rss+xml"/><item><title>MyList実装 Head/Tail/Remove F#</title><link>/2026/05/06/617db800f342da714b2108b70d3ba27377f93130/</link><pubDate>Wed, 06 May 2026 21:22:38 +0900</pubDate><author/><description>
dojo/fsharp/MyList/Program.fs at main · tk3/dojo
今日はHead/Tail/Removeを実装した。これまでの経験があればこそ比較的楽に書けた。 ただ、書けはしたものの、tryItemがちょっと怪しくて、removeAtは怪しい。体感では理解していても、きちんとした理解になっていない気がする。慣れるしかないのか。分かるようで分かっていない感じ。あーもどかしい。
let tryHead list = match list with | Empty -&amp;amp;gt; None | Cons(x, _) -&amp;amp;gt; Some x let tryTail list = match list with | Empty -&amp;amp;gt; None | Cons(_, tail) -&amp;amp;gt; Some tail let rec tryItem idx list = match list with | Empty -&amp;amp;gt; None | Cons(x, tail) -&amp;amp;gt; if idx = 0 then Some(x) else tryItem (idx - 1) tail let rec removeAt idx list = match list with | Empty -&amp;amp;gt; Empty | Cons(x, tail) -&amp;amp;gt; if idx = 0 then tail else if idx &amp;amp;lt; 0 then Cons(x, tail) else Cons(x, removeAt (idx - 1) tail)</description><guid isPermaLink="true">/2026/05/06/617db800f342da714b2108b70d3ba27377f93130/</guid></item><item><title>MyList実装 mapとfilterそしてfold F#</title><link>/2026/05/01/b154f6983eafa70ff3d3c0974fdc11d807070f37/</link><pubDate>Fri, 01 May 2026 22:33:29 +0900</pubDate><author/><description>
dojo/fsharp/MyList/Program.fs at main · tk3/dojo
今日はmapとfilterそしてfoldを実装した。 foldができたということで、これまで実装したlength、sum、reverseをfoldを使い実装し直した。foldを使うとこれまでのコードが短く書けて、汎用性が高い関数であることが分かった。
例えば、foldを使うことで、次のコードが
let sum list = let rec loop acc currentList = match currentList with | Empty -&amp;amp;gt; acc | Cons(x, tail) -&amp;amp;gt; loop (acc + x) tail loop 0 list 次のように書ける。
fold (fun acc x -&amp;amp;gt; acc + x) 0 list5 ただ、実装していて腑に落ちなかったことが一つ。F#の文法についてだ。
コンパイルNGのコード
110 let foldFilter f list = 111 let folded = fold (fun acc x -&amp;amp;gt; 112 if f x then 113 Cons(x, acc) 114 else acc 115 ) Empty list 116 117 reverse folded エラーメッセージはこちら
Program.fs(115,7): error FS0010: Unexpected identifier in binding. Expected incomplete structured construct at or before this point or other token. Program.fs(111,5): error FS3118: Incomplete value or function definition. If this is in an expression, the body of the expression must be indented to the same column as the &amp;amp;#39;let&amp;amp;#39; keyword. コンパイルOKのコード</description><guid isPermaLink="true">/2026/05/01/b154f6983eafa70ff3d3c0974fdc11d807070f37/</guid></item><item><title>リストの実装（MyList） F#</title><link>/2026/04/30/c59280bc28141d7f12340a09a2030c2528063c5f/</link><pubDate>Thu, 30 Apr 2026 22:33:20 +0900</pubDate><author/><description>
dojo/fsharp/MyList/Program.fs at main · tk3/dojo
F#でデータ構造を理解するためにリストを実装した。面白かった。
おおもとのデータ定義。 ConsはConstructの略語。お決まりの宣言みたい。Emptyはその名の通り、空を表すもの。&amp;amp;lsquo;Tは値。今回のコードではintを使っている。
type MyList&amp;amp;lt;&amp;amp;#39;T&amp;amp;gt; = | Empty | Cons of &amp;amp;#39;T * MyList&amp;amp;lt;&amp;amp;#39;T&amp;amp;gt; 実際にリストを表現すると、以下のようになる。マトリョーシカのような感じで、前の値を包み込むようになっている。
Cons (4, Cons (3, Cons (2, Cons (1, Empty)))) 今回は、length・sum・Some・contains・reverseを書いてみた。リスト実装はもう少し深掘りする予定。
ちなみにlengthはこんな感じ。forループではなく再帰で書いている。 accとは「Accumulator（アキュムレータ）」の略で、累積した値を保持している。この場合は長さを保持している。 matchで条件分岐し、Emptyになったら終了。再帰は何となくこんな感じで書くのかという理解。まだ慣れていないけれど。
let length list = let rec loop acc currentList = match currentList with | Empty -&amp;amp;gt; acc | Cons(_, tail) -&amp;amp;gt; loop (acc + 1) tail loop 0 list</description><guid isPermaLink="true">/2026/04/30/c59280bc28141d7f12340a09a2030c2528063c5f/</guid></item><item><title>選択ソート F#</title><link>/2026/04/28/31e50dcf678eb43f8d3ba7591a1fbab20d068c60/</link><pubDate>Tue, 28 Apr 2026 20:31:22 +0900</pubDate><author/><description>
dojo/fsharp/MyList/Program.fs at main · tk3/dojo
今日は選択ソート。昨日よりはすんなり書けて満足。もっと短く書けそうだが、今の自分には無理そう。
open System [&amp;amp;lt;EntryPoint&amp;amp;gt;] let main arg = let rnd = Random() let randomArray = [| for i in 1 .. 10 -&amp;amp;gt; rnd.Next(1, 101) |] for i = 0 to randomArray.Length - 1 do let mutable target = i let mutable minVal = randomArray[i] for j = i to randomArray.Length - 1 do if minVal &amp;amp;gt; randomArray[j] then minVal &amp;amp;lt;- randomArray[j] target &amp;amp;lt;- j let tmp = randomArray[i] randomArray[i] &amp;amp;lt;- randomArray[target] randomArray[target] &amp;amp;lt;- tmp printfn &amp;amp;#34;%A&amp;amp;#34; randomArray 0</description><guid isPermaLink="true">/2026/04/28/31e50dcf678eb43f8d3ba7591a1fbab20d068c60/</guid></item><item><title>バブルソート F#</title><link>/2026/04/27/6705e768bc5dbf1e13e9cd51bc61d61442dcbb16/</link><pubDate>Mon, 27 Apr 2026 21:39:09 +0900</pubDate><author/><description>
dojo/fsharp/MyList/Program.fs at main · tk3/dojo
何とか書けました。もっと早く書けそうな気がしたんだけれど、自信をなくしてしまいました。愚直にforを使っています。もっと短く書けそうな気がしますが、また今度。
open System [&amp;amp;lt;EntryPoint&amp;amp;gt;] let main argv = let rnd = Random() let randomArray = [| for i in 1 .. 10 -&amp;amp;gt; rnd.Next(1, 101) |] for i = 0 to randomArray.Length - 2 do for j = 0 to randomArray.Length - 2 - i do if randomArray[j] &amp;amp;gt; randomArray[j + 1] then let tmp = randomArray[j] randomArray[j] &amp;amp;lt;- randomArray[j + 1] randomArray[j + 1] &amp;amp;lt;- tmp printfn &amp;amp;#34;%A&amp;amp;#34; randomArray 0 # 今回分かったこと ランダムな数値の生成方法 Arrayは長さは変更できないが、値を後から書き換えることができる randomArray.[j] &amp;amp;lt;- randomArray.[j + 1] 書き込みをさせたくないならListを使う Array生成と同時に値を設定することが可能で、式を指定することができる let randomArray = [| for i in 1 .. 10 -&amp;amp;gt; rnd.Next(1, 101) |] Arrayの値をアクセスは randomArray[i] なのか randomArray.[i] なのか。一緒には見える</description><guid isPermaLink="true">/2026/04/27/6705e768bc5dbf1e13e9cd51bc61d61442dcbb16/</guid></item><item><title>F#はじめます</title><link>/2026/04/26/36a23fd6ff373260943aa4a799d27e58d2ec04c7/</link><pubDate>Sun, 26 Apr 2026 21:56:02 +0900</pubDate><author/><description>
F#は以前書いてたりはしたけれど、中途半端だったので、またやり始めます。
まずはインストール。
Ubuntu に.NETをインストールする - .NET | Microsoft Learn おきまりのHello Worldをこちらのチュートリアルで。
F# チュートリアル - 5 分でできる Hello World | .NET
出力
$ dotnet run Hello from F# あと、コマンドの使用状況を送信しているようで、オプトアウトしたい場合は次のリンクを参考に環境変数を設定する必要があります。
https://learn.microsoft.com/ja-jp/dotnet/core/tools/telemetry
export DOTNET_CLI_TELEMETRY_OPTOUT=true</description><guid isPermaLink="true">/2026/04/26/36a23fd6ff373260943aa4a799d27e58d2ec04c7/</guid></item></channel></rss>