将输出 Monad 类型的函数转换为输出原始值类型的函数

Converting a function that output a Monad type to a function that output the raw value type

我有 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)] 作为参数和 return a -> [( k,v)]作为输出。

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

我认为这在数学上是不可能的。

考虑 m 是 Maybe 的情况:函数可以 return [(k,v)] 来自 Just [(k,v)],但是它 return 来自 Nothing 会是什么?

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

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