簡體   English   中英

如何將返回[a]的函數轉換為返回Monoid的函數?

[英]How to turn a function returning [a] into a function returning a Monoid?

我正在使用以下功能處理Haskell返回類型多態性:

f :: [a] -> [a]
f [] = mempty
f (x:xs) = [x] <> f xs

顯然它什么也沒做。 我想做的就是修改類型,以便它接受一個列表並返回一個Monoid容器,其中一個可以是列表。 我被Monoid是因為Monoid接受一種類型的參數。 我不知道類型是什么: f :: Monoid m => [a] -> ?

這可能嗎?

如您所述,如果沒有可用的a- a -> m類型a -> m函數,則不能將任意a轉換為任何特定Monoid m的成員。 但是沒有適用於所有 Monoid實例的函數-如果存在,則必須在typeclass定義中,並且您可以看到它不存在。

因此,您必須像對[a] Monoid一樣,將f專用於特定的Monoid; 否則,除了[a]之外,還要接受轉換函數a -> m 也就是說,您的類型可能變為:

combine :: Monoid m => (a -> m) -> [a] -> m

如果我們向Hoogle詢問此類型 ,我們會看到您的函數已經定義(將列表概括為Foldable):

foldMap :: (Foldable t, Monoid m) => (a -> m) -> t a -> m

您可能會發現,對於可折疊foldMap ,實現foldMap或將其專門用於列表,都是一項有用的練習。

正如@amalloy所說,您需要一種將列表內容放入“ monoid容器”的方法-Monoid類未定義此類內容,因此列表的內容需要已經構成了monoid(在這種情況下,您的函數是只是mconcat ):

f :: Monoid m => [m] -> m
f = mconcat

或者您提供了一個轉換器函數(在這種情況下,您將列表的內容轉換為您的monoid, 然后執行mconcat:

f :: Monoid m => (a -> m) -> [a] -> m
f converter = mconcat . fmap converter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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