Yuji Yamamoto (山本悠滋)
2017-11-18 DevFest Shikoku 2017
動機:
を是が非でも埋めたい。
に。
に。それだけ!
にする条件と厳密に一致してませんが、あしからず。😂いろいろ乗り越えてさあAndroidからGitHubのAPIを呼ぶぞ!というところで…
... Warning: there were 1 unresolved references to library class members. You probably need to update the library versions. (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember) Warning: Exception while processing task java.io.IOException: Please correct the above warnings first._人人人人人人人人人_
> 突然のProguard <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
-dontwarn や -keep
を重ねてみるも、ゼロにはできず…。-dontwarn はコピペしたけども。省略します… hask(_ _)eller
… というのは悔しいので、予告通りEtaとHaskellのお話をします!😤
題して!
雰囲気だけは分かる!
Etaを知るためのHaskellの基本!


String)がキーで整数(Int)が値の連想配列(Map)を表す型の場合k,
vの代わりにStringとIntを適用しているclassというキーワードで始めるが、実際にはインターフェースと似てる
methodという関数が使える型全般をまとめた型クラスSomeTypeClassの宣言Hogeという型クラスに属する型」を「Hoge型クラスのインスタンス」と呼ぶMonad:
ファーストクラスな「文」っぽいものを表す型をまとめるClass:
Etaにおいて、「Javaの型をラップした型」をまとめる
+ - * /
も!&& や ||も!= とか、:: とか、この後出る
<- などは組み込み。Javaで言えば…
これも文
複数の「文」がまとまっているのもまた文だったりする
MonadMonadを「文」っぽく見せる構文糖:
do記法do記法とMonaddo記法を使った例
do以降に書いた一行一行がMonad型クラスの型の値
👇はIOという最もよく使われるMonadを使ったdo
do記法とMonaddo -- <----------------------- do記法の始まり
putStrLn "君の名前は?" -- この行がIO Monad
name <- getLine -- この行もIO Monad
putStrLn "いい名前だね!" -- この行もやっぱりIO Monaddoブロックに入るMonadのインスタンスは、1種類だけ
IOしか使えない!do記法とMonad一般化するとこんな感じ
<-という記号で代入できるdo記法とMonadMonadを実装した型によって、doに書いた各「文」と「文」の間でできることが異なる。
do記法とMonadつまり、

でできることを、Monadを実装した各種型は自由に定義することができるdo記法とMonad例えば…
Maybe Monadであれば
で処理が失敗した場合に、doブロックの処理を中断することができるMonadであれば
以降の文をリストの各要素に対して実行することができるState Monadであれば
で、doブロックの中で暗黙に共有している状態を更新することができるIO Monadであれば
で入出力処理を実行したり、例外を投げたりできる
do記法とMonad(再掲)Monad型クラスに属する型によって、do記法の中の
でできることが違う!

「本物のプログラマはHaskellを使う
- 第22回 FFIを使って他の言語の関数を呼び出す:ITpro」
から拝借した例を一つ。
例えば、C言語のmath.hで定義されているsin関数を呼びたいとき。
math.hで宣言されているCの関数sinを、Double -> Doubleという型の関数c_sinとして呼び出す」という意味。逆にplusOneというHaskellの関数をC言語で呼び出せるようにしたいとき
例えばGHCで…
MultiWayIfという言語拡張が使えるようになります。if/elseがクールに書ける!なんだか闇魔法感がありますが!
Monadという型クラスで、「文」を一般化している
Monadに属する型クラスによって、doの中でできること(=
「文」の意味)を変えることができる繰り返しになりますが…
例: Intをラップしただけの型SomeType
例: おなじみAndroidのActivityクラスを使用したいとき
😞Type Familiesとかの説明がだるいのではしょるか…。
import する引数をとらないメソッドの場合
foreign import ccall "math.h sin" c_sinなどと書いていたとの同じ。
Java Toast () とは?Java Toast () とは?Java Monad
IO Monadと違い、型引数を二つとるIO
をはじめMonad型クラスのインスタンスは、すべて型引数を1つとるJava Toast () とは?Toast()。JavaにおけるvoidのようなものJava Monadとは?Monadという型クラスで、「文」を一般化している
Monadに属する型クラスによって、doの中でできること(=
「文」の意味)を変えることができるJava Monadの場合は?
doの中でJavaのメソッドが呼べるIO Monadができること全般import する-> という記号が関数を表すStringを受け取って(TextViewに対するメソッドが呼べる)Java
Monadを返す」関数となるstaticメソッドを import するforeign import java unsafe "@static android.widget.Toast.makeText"
makeText :: Context -> String -> Int -> Java a Toasta」は「任意の型」を表す
staticなメソッドはこのように書く。staticメソッドを import するforeign import java unsafe "@static android.widget.Toast.makeText"
makeText :: Context -> String -> Int -> Java a ToastここではJava
Monadの二つ目の引数がToastであることから分かるとおり、Toastを戻り値の型として返す
staticメソッドを import する👇使うときはこう
<- で代入するJava Monadを使ってJavaのメソッドを呼ぶ<.>」を作ったforeign export java "@static info.igreque.keepmecontributinghs.KeepMeContributingWidgetProviderHs.onUpdate"
onWidgetUpdate :: Context -> Java a ()staticメソッドしかforeign exportできない
foreign export java "@static クラス名.メソッド名"
みたいな形式のみが使えるJava aなJava
Monadとなる実際に私が実装した関数(一部改変)
Java側ではこう呼ぶ