PureScriptとHaskellの差異
「Haskellと比較して、PureScriptは、~~」という構文で書く
headが型安全 ref
head :: ∀ a. List a -> Maybe a
関数合成演算子は<<< ref
hsでは.のやつ
psでは.はレコードのアクセスに使われる
逆向きの>>>もある
レコード ref
origin = { x: 0, y: 0 }に対しては、origin.xのようにして呼ぶ
hsではx originのようにして呼ぶ
型クラスの継承を表す矢印が逆向き
class A <= B where
これはBを定義する際の記述
Aを継承するということを述べている
<=を含意と見ればいい
上の例では「Bを満たすなら、Aを満たす」と読める
つまり、BはAを継承する、ということになる
型クラスの階層が、より段階的になっている
例えばSemigroupoid型クラスとかがある
ref PureScriptの型クラスの継承ツリー
ref
正格評価である
Lazyを行うためのlibraryなどもある
https://github.com/purescript/purescript-lazy
parser書く時にlazyしないと型エラーが起きるやつに出くわしたmrsekut.icon
CycleInDeclarationというエラーが起きる
その時はfix関数を使って回避した
Record型がある
https://qiita.com/asua/items/a68c7660821d0100437b
hsのrecord型の実態はタプルだが、psにはrecord型がある
PureScriptのRecord
IO型ではなくEffect型
Effectモナド
_で関数を作れる ref
PureScriptの(_)で関数を作る
例えば
code:purs(hs)
double = (2 * _)
double 10 -- 20
代わりに(?)、psではdouble = (*2)とは書けない
defaultで全域関数
部分関数にしたい場合はPartialをつける
https://qiita.com/asua/items/fb20e45cf68eed9880c1
https://qiita.com/asua/items/da5643b8df38ff4c6026
caseの漏れもdefaultでcheckされる
http://tanakh.jp/posts/2011-12-25-partial-function-considered-harmful.html
Haskellは-Wincomplete-patternsをつけないとだめ、みたいなのがあったが気する
https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/using-warnings.html#ghc-flag--Wincomplete-patterns
returnはなくpureのみ
CharとStringは別物の型
[Char] == Stringではない
そもそも[]はListではなく、Arrayを表す
ref PureScriptの型
PureScriptは[1..5]みたいな書き方ができない?
Arrayにも、Listにもその名前の関数はあるが、微妙にhsと異なるので注意
a = 1..5で、a=[1,2,3,4,5]という意味ではなく
hsではa = [1..5]mrsekut.icon
rangeの別名である
ifは式
型宣言のforallは明示的に常に必要
参考
【翻訳】PureScriptとHaskellの違い +α - Qiita
PureScriptとElmの差異
https://qiita.com/kimagure/items/f1827c9129f3ee6ede35
https://www.parsonsmatt.org/2015/10/03/elm_vs_purescript.html
#WIP
deriving自動導出がない
代わりにStandaloneDerivingがある
guardという関数があるらしい
言語拡張はないが、デフォルトで似たようなものが入っている
https://blog.miz-ar.info/2018/01/purescript/