Haskell “是否有新的类型?”;“字符串”中的任意一个;?
Haskell “是否有新的类型?”;“字符串”中的任意一个;?,haskell,Haskell,forall m。MonadFail m=>m可以替换为任一字符串,方法是替换pure=Right和fail=Left。但是,由于MonadFail的earth String实例不会很快出现(),如果我想将MonadFail与earth组合,我想我会使用一种新类型的earth String 也就是说,我相信已经有很多人提出了同样的想法。是否有任何包已经定义了这样一个新类型?我尝试过谷歌搜索,但没有成功 (用例:在纯代码中使用,即在(新类型的)或)中使用对于给定的monad,MonadFail m
forall m。MonadFail m=>m
可以替换为任一字符串,方法是替换pure=Right
和fail=Left
。但是,由于MonadFail
的earth String
实例不会很快出现(),如果我想将MonadFail
与earth
组合,我想我会使用一种新类型的earth String
也就是说,我相信已经有很多人提出了同样的想法。是否有任何包已经定义了这样一个新类型?我尝试过谷歌搜索,但没有成功
(用例:在纯代码中使用,即在(新类型的)或
)中使用对于给定的monad,MonadFail m
是一个约束,而不是一个类型MonadFail
是一个类型类(kind(Type->Type)->Constraint
),而不是像或者String
(kindType->Type
)那样的类型构造函数。@chepner我知道,这就是为什么我在问题中包括for all m.
。但是我想我应该为所有的m写。MonadFail m=>m
。无论如何,我相信您理解我的意图。因此,您可以对字符串a
值进行模式匹配,以决定是调用纯
还是失败
,但这些是函数,而不是数据构造函数。对于类型为MonadFail m=>ma
的任意值,您可以做任何类似的事情来决定是生成Right
还是Left
值,忽略一个事实,即您不能简单地从ma
值中提取类型为a
的值。@chepner ifMonadFail(任一字符串)
如果存在,则可以用数据构造函数替换函数。这就是问题的关键所在。如果您不介意引入语言扩展(和孤立实例),这实际上是可能的。只要将ma
推断为任一字符串a
,我们就可以对其进行模式匹配。我只是反驳你的猜测,即MonadFail m=>ma
与任一字符串a
同构。