[英]Haskell: how to map a function over an arbitrary tuple of monads
是否有可能構造一個函數,以映射任意Arity的單子元組?
例如,
f :: (m a -> m [a]) -> (m x, m y) -> (m [x], m [y])
(但出於任意禮節)。 這個類似的問題 ,有許多有希望的建議; 例如, each
鏡頭或over both
鏡頭each
鏡頭,但每個鏡頭似乎都需要一個同質類型的元組:我想使用一個具有不同內部類型的同質單子元組。
您所說的方式是不可能的。
在類型簽名中,初始函數只能使用ma
,但是您希望將其傳遞給mx
和my
,因此類型不匹配。
啟用rankNTypes
當然可以做到這rankNTypes
:
{-# LANGUAGE rankNTypes #-}
f :: Monad m => (forall a. m a -> m [a]) -> (m x, m y) -> (m [x], m [y])
f fun (x, y) = (fun x, fun y)
這是因為forall a.
括號內迫使它是多態的,而不僅僅是一個類型a
。
您可能想要的是這樣的東西:
f :: Monad m => (a -> m b) -> (m a, m a) -> (m b, m b)
甚至
f :: Monad m => (a -> m c) -> (b -> m d) -> (m a, m b) -> (m c, m d)
請注意,我將函數類型從ma -> mb
更改為ma -> mb
a -> mb
因為這使我們可以對單聲道動作進行排序,而不是對單聲道進行轉換,這在我們要操縱它們時更有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.