假设我有一个高阶函数,它使用从函数参数中检索到的值执行一些计算。
f :: a -> (b -> c) -> d
其中 a,b,c,d 是一些具体类型。
然后我有这种类型的功能
g :: b -> m c
其中 m 是一些单子。
现在有一种方法可以将 g 与 f 一起使用。那就是把 f 变成一个函数,它产生m d
而不是d
使用 g 作为它的第二个参数?
一个具体的例子是 m 是 IO monad,f 是一个函数,计算从其函数参数中检索到的 n 个数字的总和,而 g 从标准输入中读取一个数字。
f n g = sum $ map g (1..n)
g :: Int -> IO Int
g _ = readLn
我知道有一些函数可以将标准输入转换为惰性列表,这可以解决这个问题,但我的实际情况并不是那么简单。
假设我有一个在图上做某事的算法。该算法使用功能参数来确定节点的邻居。这样我就可以有多个图的实现。
现在我想将此算法与非确定性图(List monad)或不完全已知的图(Maybe monad)一起使用。我知道我可以重写算法以使用单子,然后将身份单子用于基本情况,但这是唯一的方法吗?我认为在没有单子的情况下编写算法会更容易。
这种行为可能吗?我找不到不应该这样做的原因,但我无法找到解决方法。