まとめ
> (==) (\x -> x) (\x -> x)
Error: Trying to use `(==)` on functions.
There is no way to know if functions are "the same" in the Elm sense.
Read more about this at https://package.elm-lang.org/packages/elm/core/latest/Basics#== which describes why it is this way and what the better version will look like.>
> funcHoge x = x
<function> : a -> a
> (==) funcHoge funcHoge
True : Bool
> funcFuga=funcHoge
<function> : a -> a
> (==) funcHoge funcFuga
True : Bool
> funcPiyo x = x
<function> : a -> a
> (==) funcHoge funcPiyo
Error: Trying to use `(==)` on functions.
There is no way to know if functions are "the same" in the Elm sense.
Read more about this at https://package.elm-lang.org/packages/elm/core/latest/Basics#== which describes why it is this way and what the better version will look like.>
本文
タイトル意味不明でごめんなさい。
Elmで関数同士を比較して遊んでたら、 @ababup1192 先生から「関数同士は比較できないのでは」との指摘を受けた。しかし、一部ケースでは比較できてしまっていた。
ソースコードを調べてみると、
https://github.com/elm/core/blob/1.0.2/src/Elm/Kernel/Utils.js#L35-L44
あたりで (==)
の実装が行われていた。
これをみると、
- javascriptで
===
で比較し、trueであれば、その時点でtrueが返る。 - もし成立しなければ、関数は
object
でもnull
でもないので、if文の中に入り、function
であるので、 - https://github.com/elm/core/blob/1.0.2/src/Elm/Kernel/Debug.js#L262-L263 が呼ばれる。
つまり、関数同士を比較すると、全く同じものであれば true
が、そうでなければ error
として返ってくる。
「全く同じもの」である定義としては、「別名をつける」は含まれるが、「同じ定義である別関数」は含まれないようだ。(それはそうか、比較しようがないし)
というわけであまり使い道がないが、関数同士は全く同じであれば比較できるようだ。