我有两个功能:
fun1 :: Int -> [Int]
fun2 :: [Int] -> [Int]
fun2
接受Int list
并使用帮助fun1
将map
应用于此列表的每个元素。但fun1
返回[Int]
。所以,我有类型冲突。如何解决我的问题?
答案 0 :(得分:5)
您可能需要map
和concat
的组合来实现它。假设fun1
和fun2
是这样的:
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)