如何在map函数中连接列表 - Haskell?

时间:2015-04-30 10:33:44

标签: function haskell

我有两个功能:

fun1 :: Int -> [Int]
fun2 :: [Int] -> [Int]

fun2接受Int list并使用帮助fun1map应用于此列表的每个元素。但fun1返回[Int]。所以,我有类型冲突。如何解决我的问题?

2 个答案:

答案 0 :(得分:5)

您可能需要mapconcat的组合来实现它。假设fun1fun2是这样的:

fun1 :: Int -> [Int]
fun1 x = [x,x]

fun2 :: [Int] -> [Int]
fun2 = map (+ 1)

solution :: [Int] -> [Int]
solution xs = concat $ map fun1 (fun2 xs)

或者根据@CarstenKonig的建议,您可以使用concatMap

solution2 :: [Int] -> [Int]
solution2 xs = concatMap fun1 $ fun2 xs

可以进一步简化为:

solution2 :: [Int] -> [Int]
solution2 = concatMap fun1 . fun2

答案 1 :(得分:3)

[[a]]转换为[a]的能力使List(除其他事项外)成为Monad。 因此,您可以使用备注:

fun2 xs = do 
     x <- xs
     fun1 x

可以重写fun2 xs = xs >>= fun1甚至更好

fun2 = (>>= fun1)