簡體   English   中英

Haskell:如何在一個單元組的任意元組上映射一個函數

[英]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 ,但是您希望將其傳遞給mxmy ,因此類型不匹配。

啟用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM