gpt4 book ai didi

Haskell笛卡尔积,带过滤器的Monad

转载 作者:行者123 更新时间:2023-12-04 18:11:07 25 4
gpt4 key购买 nike

这必须非常简单,我很不高兴,在我的 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: [()]

我尝试了其他一些东西,比如 Haskell wiki 中的 if' 函数。我也试过 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 函数中解决这个问题以上。
谢谢

最佳答案

尝试:

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 [] 你需要一个输出类型为 [t] 的函数)。所以你需要提供相同的类型,即空列表 [] .
另一方面,当你写 return ()它实际上是 [()] ,其类型为 [()] ,这与类型 [(Int, Int)] 不同.

关于Haskell笛卡尔积,带过滤器的Monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70601502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com