我有兩個功能:如何連接地圖函數中的列表 - Haskell?
fun1 :: Int -> [Int]
fun2 :: [Int] -> [Int]
fun2
接受Int list
和應用fun1
到此列表中的每個元素的幫助map
。但fun1
返回[Int]
。所以,我有類型衝突。如何解決我的問題?
我有兩個功能:如何連接地圖函數中的列表 - Haskell?
fun1 :: Int -> [Int]
fun2 :: [Int] -> [Int]
fun2
接受Int list
和應用fun1
到此列表中的每個元素的幫助map
。但fun1
返回[Int]
。所以,我有類型衝突。如何解決我的問題?
您可能需要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
的能力將[[a]]
轉換爲[a]
是使List
(等等)成爲Monad的原因。 因此,您可以使用做記號:
fun2 xs = do
x <- xs
fun1 x
可在改寫fun2 xs = xs >>= fun1
甚至更好
fun2 = (>>= fun1)
另一種方法是用列表理解。映射fun1
在列表xs
是
fun2' xs = [ fun1 x | x <- xs ]
-- = map fun1 xs
-- = do x <- xs -- for each x in xs:
-- return (fun1 x) -- yield (fun1 x)
這的確將有一個不同類型的比你想要的東西。
要弄平一步我們做
fun2 xs = [ y | x <- xs, y <- fun1 x ]
-- = concatMap fun1 xs
-- = do x <- xs -- for each x in xs:
-- y <- fun1 x -- for each y in (fun1 x):
-- return y -- yield y
應該FUN2如下'FUN2 :: [INT] - > [INT]]' – PriestVallon
此外,我不是很確定你想什麼去做?這只是爲了解決類型衝突嗎? – PriestVallon
一個例子可以澄清查詢... – elm