[英]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.