2010-10-22 44 views
8

我剛剛寫了這個功能,只是需要一對,其第二個值是在一些單子,和「拉單子去」覆蓋整個對。這個簡單的Haskell函數是否已經有一個衆所周知的名字?

unSndM :: Monad m => (a, m c) -> m (a, c) 
unSndM (x, y) = do y' <- y 
        return (x, y') 

是否有更好和/或更短或無點或甚至標準的方式來表達?

我得儘可能下文中,-XTupleSections開啓...

unSndM' :: Monad m => (a, m c) -> m (a, c) 
unSndM' (x, y) = y >>= return . (x,) 

謝謝!

+0

標籤'code-golf'的規則:http://stackoverflow.com/tags/code-golf/info – Nakilon 2010-10-22 23:53:03

+0

不夠公平。該網站讓我添加標籤而不告訴我有與之相關的規則。 *聳聳肩* – gimboland 2010-10-23 08:52:24

回答

12

一個次要的一點:有可能這個只用fmap(無>>=)寫的,所以你真的只需要一個Functor實例:

unSndM :: (Functor f) => (a, f c) -> f (a, c) 
unSndM (x, y) = fmap ((,) x) y 

這個版本是一個比較普遍。爲了回答你有關pointfree版本的問題,我們就可以問pointfree

[email protected]% pointfree "unSndM (x, y) = fmap ((,) x) y" 
unSndM = uncurry (fmap . (,)) 

所以,是的,甚至更短的版本是可能的,但我個人覺得uncurry有點難以閱讀和避免它在大多數情況下。

如果我是在寫我自己的代碼此功能,我可能會使用<$>Control.Applicative,這並剃去一個字:

unSndM :: (Functor f) => (a, f c) -> f (a, c) 
unSndM (x, y) = ((,) x) <$> y 

<$>僅僅是fmap的代名詞,而我喜歡它使事實上這是一種功能應用程序更清晰一點。

+1

這個tupling也碰巧被命令方便,允許定義像'unSmdM = uncurry $ fmap。(,)'。有趣的是,這個函數的類型比任何一個實現都更具可讀性/描述性:) – Anthony 2010-10-22 15:45:42

+1

我同意,但'unSndM(x,y)=(x,)<$> y'非常接近。 – 2010-10-22 15:56:38

+0

哦,我不知道關於pointfree - 不錯,謝謝! (當然,我試過hoogle。)這裏有一些不錯的版本,沒有任何額外的導入或對庫的修改;-) - 謝謝。 :-) – gimboland 2010-10-22 22:15:26

3

Hoogle是你的朋友。如果標準庫的一個有它那麼hoogle爲「Monad m => (a, m b) -> m (a,b)」將找到它。注意函數仍然處於hackage包,但它往往是不值得額外的集結DEP只是這樣的小功能。

+0

「往往不值得爲這樣的小功能額外的build-dep」< - 這是一件非常可悲的事情:( – Fresheyeball 2015-07-06 02:27:41

13

如果(,) x)TraversableFoldable實例是在圖書館(我想我必須爲自己的缺席有些責備的)...

instance Traversable ((,) x) where 
    traverse f (x, y) = (,) x <$> f y 

instance Foldable ((,) x) where 
    foldMap = foldMapDefault 

...那麼這個(有時被稱爲「強度」)將是Data.Traversable.sequence專業化。

sequence :: (Traversable t, Monad m) => t (m a) -> m (t a) 

所以

sequence :: (Monad m) => ((,) x) (m a) -> m (((,) x) a) 

sequence :: (Monad m) => (x, m a) -> m (x, a) 

事實上,順序並沒有真正使用的Monad全功率:Applicative會做。此外,在這種情況下,與x的配對是線性的,所以traverse只做<$>而不是pure<*>的其他隨機組合,並且(如其他地方已經指出的),您只需要m具有函數結構。

+1

聽起來像一個圖書館的誕生@對我的建議:-) – sclv 2010-10-22 17:37:05

+1

不錯,而且costrength也是序列! http://hackage.haskell.org/packages/archive/category-extras/0.53.5/doc/html/src/Control-Functor-Strong.html – 2010-10-22 21:06:50

+1

令人驚訝的東西。我知道它看起來很簡單,以至於類別理論家必須已經給它一個名字。 :-) – gimboland 2010-10-22 22:29:57

相關問題