gpt4 book ai didi

haskell - Haskell 中列表生成器的真正意义

转载 作者:行者123 更新时间:2023-12-04 21:56:20 25 4
gpt4 key购买 nike

据我了解,代码

l = [(a,b)|a<-[1,2],b<-[3,4]]

相当于
l = do
a <- [1,2]
b <- [3,4]
return (a,b)

或者
[1,2] >>= (\a -> [3,4] >>= (\b -> return (a,b)))

此类表达式的类型为 [(t,t1)],其中 t 和 t1 在 Num 中。

如果我写类似的东西
getLine >>= (\a -> getLine >>= (\b -> return (a,b)))

解释器读取两行并返回一个包含它们的元组。

但是我可以在列表生成器中使用 getLine 或类似的东西吗?

表达方式
[x|x<-getLine]

返回错误“无法匹配预期类型 [t0]' with actual type IO 字符串”

但是,当然,这适用于 do-notation 或使用 (>>=)。

列表生成器的重点是什么,它们与 do-notation 之间的实际区别是什么?

使用列表生成时是否有任何类型限制?

最佳答案

这是一个明智的观察,你不是第一个偶然发现的。你说得对,[x|x<-getLine]的翻译将导致一个完全有效的 monadic 表达式。关键是我认为列表推导式是 first仅作为列表的方便语法引入,并且(可能)没有人认为人们可能会将它们用于其他 monad。

但是,由于限制到 []不是必需的,有一个 GHC 扩展名为 -XMonadComprehensions 这消除了限制并允许您准确地编写您想要的内容:

Prelude> :set -XMonadComprehensions 
Prelude> [x|x<-getLine]
sdf
"sdf"

关于haskell - Haskell 中列表生成器的真正意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35336834/

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