這必須非常簡單,我很不高興我在 Haskell 的經驗中無法弄清楚這一點。我想要一個串列的笛卡爾積,但我想過濾掉相同的專案。我不想要后置過濾器。
這讓我獲得了 CP - 似乎設定為簡單地添加過濾器......
p as bs = do
a <- as
b <- bs
return (a,b)
p [1,2,3] [1,2,3]
[(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)]
我讀過這return ()基本上是 do 符號中的 noop - 但這不能編譯。(元組是否混淆了)
pf as bs = do
a <- as
b <- bs
if a == b then return () else return (a,b)
* Couldn't match type `()' with `(a, a)'
Expected type: [(a, a)]
Actual type: [()]
我嘗試了其他一些東西,比如if'Haskell wiki 中的函式。我也試過when沒有成功。當過濾器是when
when (a /= b) return (a,b)
* Couldn't match type `m0 (a, a)' with `()'
Expected type: (a, a) -> ()
Actual type: (a, a) -> m0 (a, a)
我想這些錯誤訊息讓我對這個問題嗤之以鼻,但我還不擅長翻譯其中的大部分。
很可能有一個更高級別的函式可以以更直接的方式處理這個問題(filterM?),我很高興聽到它的用法,但我仍然想知道如何在pf上面的函式中解決這個問題.
謝謝
uj5u.com熱心網友回復:
嘗試:
module Main where
main :: IO ()
main = print $ p [1,2,3] [1,2,3] -- [(1,2),(1,3),(2,1),(2,3),(3,1),(3,2)]
p as bs =
do
a <- as
b <- bs
if a == b then [] else return (a, b)
我最近才學了一點 Haskell,所以我可能是錯的。在這種情況下,return (a, b)無非是運算式[(a, b)](這是很自然的,因為對于 monad,[]您需要一個輸出型別為 type 的函式[t])。所以你需要提供相同的型別,即空串列[]。
另一方面,當您return ()實際撰寫它時[()],它的型別是[()],這與型別不同[(Int, Int)]。
uj5u.com熱心網友回復:
您也可以使用Control.Monad.guard代替[]直接使用。
import Control.Monad (guard)
p as bs =
do
a <- as
b <- bs
guard $ a /= b
return (a, b)
您可以將其視為dolist-comprehension的-notation 版本[(a, b) | a <- as, b <- bs, a /= b]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/404593.html
標籤:
上一篇:Haskell函式回傳其輸入
