目次・概要

ガイド

.NET

GitHub

Description Link
C# language design https://github.com/dotnet/csharplang
Compiler implementation https://github.com/dotnet/roslyn
Standard to describe the language https://github.com/dotnet/csharpstandard

コマンド

バージョン
dotnet --version

Emacs連携

FSAutoCompleteが導入できないとき

コマンドが誤っています

dotnet-path/to/.emacs.d/.cache/lsp/fsautocomplete/fsautocomplete.dllが見つかりません.

FsAutoComplete

fsi

Macでの調整

EmacsでのFSACエラー

cat /etc/dotnet/install_location

/usr/local/share/dotnet/x64
->
/usr/local/share/dotnet

trydotnet, ifsharp, Jupyter notebook with .NET Core

Try .NET, Jupyter notebook with .NET Core

要調査: これ用にインストールしたパッケージは ~/.trydotnet に置かれる?

dotnet tool install --global Microsoft.dotnet-interactive
dotnet interactive jupyter install
jupyter kernelspec list

IFsharp へのパッケージ導入

trydotnet でも同じ?

まとめ
#load "Paket.fsx"
Paket.Package ["Newtonsoft.Json"; "Deedle"; "MathNet.Numerics"; "MathNet.Numerics.FSharp"; ]
#load "Paket.Generated.Refs.fsx"

open System
open Deedle
open MathNet.Numerics
open Newtonsoft.Json\
open MathNet.Numerics.LinearAlgebra

load "XPlot.Plotly.Paket.fsx"
load "XPlot.Plotly.fsx""
open FSharp.Core
open XPlot.Plotly

// 以下はF# 5以降の方法:いったんコメントアウト。
//#r "nuget:Deedle"
//#r "nuget:DiffSharp"
//#r "nuget:FSharpPlus"
//#r "nuget:MathNet.Numerics"
//#r "nuget:MathNet.Numerics.FSharp"
//#r "nuget:XPlot"
ツイートからのやりとり

緩募 IFsharp で DiffSharp を使う方法. そもそもどうやって導入すればいいのかさえわからない. Powershell で dotnet add package DiffSharp --version 0.7.7 と打ったら「プロジェクトが見つかりませんでした」とか言われて怒られる. Install-Package でもうまくいかない. つらい.

そもそも .NET には一般のプログラミング言語と違いグローバルなライブラリ環境が存在しない, ということに注意が必要です. では dotnet add package や Install-Package は何をするコマンドなのかというと, 単一のプロジェクト (*.fsproj) に依存パッケージを追加するコマンドです.

一方 IFSharp は F# interactive の上に構築されているのでプロジェクトが存在しません. ではどうすればよいのかというと, ここに記載されているように

load "Paket.fsx"

としてから Paket.Package もしくは Paket.Version (バージョン指定) に使いたいパッケージ名を渡し,

load "Paket.Generated.Refs.fsx"

とすることでパッケージを IFSharp の環境にインストールすることができます. 初回実行時にはパッケージの依存解決とダウンロードが走るので処理に時間がかかります. また Paket を使うセルは他の処理と分けておいた方がよいです (補完を利かせるため).

vscode連携

ツールチップなどが出てこない

やたらエラーが出る

Windowsでの英語化

アンインストール

Mac

/tmp直下

事前にバージョン(curlでのダウンロード先)を確認すること.

cd /tmp
curl -OL https://github.com/dotnet/cli-lab/releases/download/1.5.255402/dotnet-core-uninstall.tar.gz
mkdir -p /tmp/dotnet-core-uninstall
tar -zxf dotnet-core-uninstall.tar.gz -C dotnet-core-uninstall
cd dotnet-core-uninstall
dotnet-core-uninstall list
./dotnet-core-uninstall -h
~/tmp直下

事前にバージョン(curlでのダウンロード先)を確認すること.

cd ~/tmp
curl -OL https://github.com/dotnet/cli-lab/releases/download/1.5.255402/dotnet-core-uninstall.tar.gz
mkdir -p ~/tmp/dotnet-core-uninstall
tar -zxf dotnet-core-uninstall.tar.gz -C dotnet-core-uninstall
cd dotnet-core-uninstall
dotnet-core-uninstall list
./dotnet-core-uninstall -h

インストール

Windows

M1 Mac

Linux

dotnet-install.shを使うとき

プロジェクト作成

VSCodeを前提にする.

setup.txt

dotnet new sln -o MySolution
cd MySolution
mkdir src
dotnet new console -lang F# -o src/MyProject
dotnet sln add src/MyProject/MyProject.fsproj
mkdir tests
dotnet new xunit -lang F# -o tests/MyProjectTests
dotnet sln add tests/MyProjectTests/MyProjectTests.fsproj
cd tests/MyProjectTests
dotnet add reference ../../src/MyProject/MyProject.fsproj
dotnet add package FsUnit
dotnet add package FsUnit.XUnit
dotnet build
dotnet test

記事集

公式情報

よくまとまっていて参考になる

MISC

bottom

let undefined<'T> : 'T = failwith "Not implemented yet"

let stub1 (x : int) : float = undefined
let stub2 (x : 'T) : 'T = undefined
let undefined<'T> : 'T = raise (NotImplementedException())

fsxで他のfsxを読み込む

#load "Script1.fsx"
open Script1

Fable

メモ

dotnet new --install Fable.Template
dotnet new fable

Json

open System.Text.Json
open System.Text.Json.Serialization
open System.Text.Encodings.Web
open System.Text.Unicode

let mutable options = JsonSerializerOptions()
options.Encoder <- JavaScriptEncoder.Create(UnicodeRanges.All)
let jsonString = JsonSerializer.Serialize(items, options)
System.IO.File.WriteAllText(outputJsonFileName, jsonString, System.Text.Encoding.UTF8)

Stack overflow

AtCoderの木DPで, Pythonコードに沿って実装してみたらStack overflowしたのでその対処の記録.

Stringにはreverseがない(?)ので代替策を見つけた

どなたか有識者の方, いい感じのメソッドがあれば教えてほしい. 今回はProject Euler Problem 4の回文数の問題を解いているときに出くわした. どうもStringにはreverseメソッドがないらしい. 検索した結果, 今回はこのページのコピペとして次のコードを採用した.

let reverse (s : string) = s |> Seq.toArray |> Array.rev |> System.String
s |> Seq.rev |> System.String.Concat

あと最近F#のリファレンスがGitHubにうつったようだ. そのリンクも改めて貼っておこう.

GitHubのAlgorithmsAndDataStructureByFSharpにアルゴリズム系のコードと共にF#の「ライブラリ」という名の自分用コードサンプル集を作ってある. 具体的にはLibraryディレクトリがそう. そのうち競プロ用にいろいろ調べたことを改めてLibraryにまとめ直したい. 何はともあれ,

F#, とにかく情報がないので地道に貯めていく.

関数に型をつける

ふつうの方法

let f (i:int) (j:int): int = i * j

ラムダを使う方法

let f: int -> int -> int =
  fun i j -> i * j

空シーケンスの判定, 特にmatch

let rec dropWhile p xs =
  match xs with
    | s when Seq.isEmpty s -> Seq.empty
    | _ -> if p (Seq.head) then dropWhile p (Seq.tail xs) else (Seq.tail xs)

遅延リスト

Seq.initInfinite (fun i -> 2 * i + 1)

ファイルの読み書き

let fileName = "1.tmp.txt"
System.IO.File.WriteAllText(fileName, someString, System.Text.Encoding.Default)

複数行の文字列, ヒアドキュメント

C#と同じように書ける模様. 特に三重引用符または「@+クオート」で書ける. ついでに逐次的リテラル文字列の概念があり, 後者の「@+クォート」形式がそれ. 例を引用しておく.

".¥¥hoge¥¥hoge¥¥hoge.txt" // ふつうの文字列
@".¥hoge¥hoge¥hoge.txt"   // 逐次的リテラル文字列