首页 > 解决方案 > 将输出 Monad 类型的函数转换为输出原始值类型的函数

问题描述

我有 2 个类型定义

type Mapper a k v = a -> [(k,v)]
type MapperM m a k v = a -> m [(k,v)]

我想编写一个从类型转换值的函数

(Ord k, Monad m) => MapperM m a k v

输入

Ord k => Mapper a k v 

基本上是一个以a -> m [(k,v)]作为参数并返回a -> [(k,v)]作为输出的函数。

我所有的尝试都以 Haskell 类型检查失败。

标签: haskellmonads

解决方案


我相信这在数学上是不可能的。

考虑当 m 为 Maybe 的情况:函数可以从 Just [(k,v)] 返回 [(k,v)],但它会从 Nothing 返回什么?

如果 monad 是 IO,从 monad 中提取参数会破坏 IO 提供的安全性。

还要考虑你的函数必须适用于任何可以想象的单子。


推荐阅读