2012-04-25 34 views
16

Thay vì fmap, áp dụng một chức năng để một giá trị-trong-một-functor:Có tên cho chức năng hoặc mẫu này không?

fmap :: Functor f => (a -> b) -> f a -> f b 

tôi cần một chức năng mà các functor có một chức năng và giá trị là đồng bằng:

thing :: Functor f => f (a -> b) -> a -> f b 

nhưng tôi can't find one.

Mẫu này được gọi là gì, ở đâu tôi áp dụng chức năng-trong-một-hàm (hoặc trong một ứng dụng, hoặc trong một đơn nguyên) cho một giá trị đơn giản?

Tôi đã triển khai nó rồi, tôi chỉ không hiểu những gì tôi đã làm và tại sao không có chức năng như vậy trong thư viện chuẩn.

+4

Đây không phải là trường hợp đặc biệt của Ứng dụng? Giống như 'func <*> giá trị thuần túy'? –

+2

Lưu ý rằng loại này rất giống với 'ap' và' <*> '. Mặc dù tôi không nhìn thấy một phiên bản 'Functor' tương ứng, và điều này có thể được thực hiện mà không cần giả sử' Applicative 'hoặc' Monad 's:' điều fs x = fmap (\ f -> fx) fs' –

+0

Yep, lambdabot nói 'thing = (.pure). (<*>) 'hoặc' điều = lật (fmap. Lật id) '. Nhưng tôi nhận được nó rằng đây không phải là những gì bạn muốn biết :) –

Trả lời

19

Bạn không cần Applicative cho việc này (?); Functor sẽ làm tốt:

apply f x = fmap ($ x) f 
-- or, expanded: 
apply f x = fmap (\f' -> f' x) f 

Điều thú vị là, apply thực sự là một sự tổng quát của flip; lambdabot thay thế flip với định nghĩa này là một trong những khái quát chung của tiêu chuẩn Haskell, vì vậy đó là một tên có thể, mặc dù một cái khó hiểu.

Nhân tiện, nó thường đáng để thử Hayoo (tìm kiếm toàn bộ Hackage, không giống Hoogle) để xem tên nào là hàm thường được cung cấp và cho dù đó là bất kỳ gói chung nào. Tìm kiếm f (a -> b) -> a -> f b, nó tìm thấy flip (trong Data.Functor.Syntax, từ gói functors) và ($#) (từ gói synthesizer) dưới dạng tên có thể. Tuy nhiên, tôi có thể chỉ cần sử dụng fmap ($ arg) f tại trang web sử dụng.

7

Như Niklas nói, đây là ứng dụng trong một số hàm functor với giá trị được nâng lên.

\f a -> f <*> pure a 

:: Applicative f => f (a -> b) -> a -> f b 

hoặc tổng quát hơn, sử dụng Category(.)

\f a -> f . pure a 

:: (Applicative (cat a), Category cat) => cat b c -> b -> cat a c 
Các vấn đề liên quan