2013-05-09 88 views
0

我有这个编码功能:Haskell:使用带有返回列表的函数的映射?

class Encode a where 
    encode :: a -> [Bit] 

,我有写编码类型的列表位列表的功能问题。我想递归编码列表的元素。根据我的理解,您可以使用地图功能来实现此目的。问题是编码返回一个列表[位],而地图只需要位。我该如何解决这个问题?这是该计划的相关部分。

instance Encode a => Encode [a] where 
    encode [] = [I, O, O, I, O, I] 
    encode m = ([I, O, O] ++ (map encode m) ++ [I, O, I]) 

回答

6

使用concatMap。它concatmap ping它们之后获得结果。

instance Encode a => Encode [a] where 
    encode [] = [I, O, O, I, O, I] 
    encode m = ([I, O, O] ++ (concatMap encode m) ++ [I, O, I]) 

你怎么能发现这一点自己:如果你搜索你想要的功能,(a -> [Bit]) -> [a] -> [Bit]的类型,使用HoogleconcatMap是第一个结果。

+0

谢谢,这工作。 :) – user2367390 2013-05-09 18:15:43

+6

你甚至不需要特殊处理空列表@ user2367390,它也被第二个方程所涵盖。 – 2013-05-09 18:21:19

+1

继续关于Hoogle的评论 - 对这种情况的有用方法是放置一个自定义函数,使用undefined定义它,然后使用ghci来查找类型(':t function')。这显示了编译器推断的类型;这可以帮助编写该功能,或者您可以使用Hoogle搜索签名。 (这里意味着定义'encode m =([I,O,O] ++(map'encode m)++ [I,O,I])'和'map'= undefined';在ghci中加载并输入':t map'')。 – isturdy 2013-05-09 19:31:15