请考虑以下代码:
data T b where
T :: Maybe (a -> b) -> a -> T b
g (T (Just f) x) = f x
g (T Nothing x) = x
这不能编译,我们在Nothing
的{{1}}定义上收到错误。这是因为g
不会阻止内部类型Nothing
与外部可见类型a
不同。
现在考虑这种替代方法:
b
这个编译没有问题。
这是另一个有趣的例子:
data Maybe' b a where
Just' :: a -> Maybe' b a
Nothing' :: Maybe' b b
data T' b where
T' :: Maybe' (a -> a) (a -> b) -> a -> T' b
g' (T' (Just' f) x) = f x
g' (T' Nothing' x) = x
Hackage上是否已经提供了一个允许dotMaybe ::
Maybe' (dummy1 -> dummy1) (b -> c) ->
Maybe' (dummy2 -> dummy2) (a -> b) ->
Maybe' (dummy2 -> dummy2) (a -> c)
dotMaybe (Just' f) (Just' g) = Just' (f . g)
dotMaybe (Just' f) Nothing' = Just' f
dotMaybe Nothing' (Just' g) = Just' g
dotMaybe Nothing' Nothing' = Nothing'
中演示的功能的软件包,或者我应该打包一些东西?我只是不想重新发明轮子。