簡體   English   中英

在haskell中獲取函數作為參數

[英]Get function as parameter in haskell

我不知道這個,我有一個叫做Enumeration的類型

> type Enumeration a = Int -> [a]

我需要映射它。 我編寫了以下函數:

> imapE :: (a -> b) -> Enumeration a -> Enumeration b
> imapE f (m fa) = \n -> imapF f fa

imapF的定義如下:

> imapF :: (a -> b) -> [a] -> [b] 
> imapF _ [] = []
> imapF f (x:xs) = f x : imapF f xs

但是,當我嘗試加載代碼時,出現以下錯誤BinaryTrees.lhs:91:14: Parse error in pattern: m關於我的imapE函數的BinaryTrees.lhs:91:14: Parse error in pattern: m

我正在嘗試獲取第一個枚舉Enumeration a作為它的函數(Int和[a])

您不能對函數進行模式匹配,但不必這樣做:

> imapE :: (a -> b) -> Enumeration a -> Enumeration b
> imapE f g = (imapF f) . g

(好吧, imapF實際上只是map )。

不使用.

> imapE :: (a -> b) -> Enumeration a -> Enumeration b
> imapE f g = \n -> imapF f (g n)

一個可能的解決方案可能是

imapE :: (a -> b) -> Enumeration a -> Enumeration b
imapE = map . map

確實,以上等同於

imapE f = map (map f)

哪里

f :: a -> b
map f :: [a] -> [b]
map (map f) :: (Int -> [a]) -> (Int -> [b])

因為[](->) Int都是函子。

此類練習的主要“技巧”是更多地考慮類型而不是實際值。

如果您是初學者,這可能會有點晦澀。 但是,一旦您對函子更加熟悉,這將變得很自然。

(非常習慣這種風格的人甚至可以用一些模糊的注解“ functors compose”來暗示這種解決方案,讓您自己弄清楚到底是怎么回事。當發生這種情況時,請不要放棄-最終它將變得有意義; -))

暫無
暫無

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

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