質問編集履歴

1

修正

2019/12/04 07:43

投稿

mightyMask
mightyMask

スコア143

test CHANGED
File without changes
test CHANGED
@@ -10,10 +10,56 @@
10
10
 
11
11
  ```
12
12
 
13
- EitherMaybeと挙動が違うのは何故でしょう?
13
+ `Either`の`<>`演算を`Maybe`同じよに使いたいですが、何か解決策ありますでしょう
14
14
 
15
- 個人的には、 Maybeの定義```type Maybe a = Either () a```充分に感じます。
15
+ Haskell技巧的な方法いろいろ解決できると感じているので、にか出来そではあります
16
16
 
17
17
 
18
18
 
19
+ ### 余談
20
+
19
- EitherMonoid演算をMaybeと同じように使いたいのですが、何か解決策はありますでしょうか?
21
+ EitherMaybeの一般化ですので、それをコードで表してる方綺麗な感じがします
22
+
23
+ 個人的には以下のコードみたいな感じであってほしいです。
24
+
25
+ ユニット型がMonoidであるという性質も生かせていて、綺麗だと思うのです。
26
+
27
+ ``` Haskell
28
+
29
+ -- import Prelude hiding (Either, Left, Right, Maybe)
30
+
31
+
32
+
33
+ data Either l r = Left l | Right r
34
+
35
+ type Maybe a = Either () a
36
+
37
+
38
+
39
+ instance (Semigroup l, Semigroup r) => Semigroup (Either l r) where
40
+
41
+ Right x <> Right y = Right $ x <> y
42
+
43
+ Right x <> Left _ = Right x
44
+
45
+ Left _ <> Right y = Right y
46
+
47
+ Left x <> Left y = Left $ x <> y
48
+
49
+
50
+
51
+ instance (Monoid l, Semigroup r) => Monoid (Either l r) where
52
+
53
+ mempty = Left mempty
54
+
55
+
56
+
57
+ ```
58
+
59
+
60
+
61
+ 具体的には、`Either`に対して定義されている`(|||)`や`right`といった関数を`Maybe`にもそのまま流用できたりします。
62
+
63
+ この場合は`fromMaybe`や`fmap`で充分ではありますが、他に良い例が思いつきませんでした。
64
+
65
+ これをそのまま使えば良いじゃんって思うかもしれませんが、そうすると他のライブラリと整合性がつかなくて不便です。