我的问题涉及回答另一个问题:https://stackoverflow.com/a/11766789/3212958是否< - 在Haskell do块中隐式强制类型?
在他的回答,ertes写入以下类型签名
select :: [a] -> [(a, [a])]
然而,当select
实际使用,ertes写入do
内的以下阻止
(y, ys) <- select xs
请帮我流下的元组(y, ys)
怎样的选择,名字返回类型相匹配的一些光ly [(a, [a])]
。 Haskell在某些时候强制类型? (Haskell曾经强制类型?)<-
从select
返回的列表monad中提取类型的元组?
感谢, 最大
---编辑:---
@Lee提醒newbs试图推理类型的前desugar。在明确了>>=
后,更清楚发生了什么事情。脱糖后,有问题的函数看起来像:
select xs >>= \(y, ys) -> fmap (y:) (perms (n - 1) ys)
而对于名单,xs >>= f = concat (map f xs)
。因此,在这种情况下更好的读取(y, ys)
是作为映射到列表上的函数的签名。
'select'返回一个列表。如果你写'a < - 选择xs',那么'a'是'select xs'的每个元素。如果你后来编写'func a',结果就是在'select xs'的每个元素上应用'func'的结果。这就是列表monad的定义方式。 'a < - 选择xs; func a'与'select xs >> = func'相同。绑定列表被定义为:'m >> = f = concat(map f m)',因此您正在编写'map func(select xs)'。哈斯克尔没有类型强制。 – user2407038
@ user2407038这里有一些细微的技术性问题; “a”不是“每个元素”,“a”表示列表中的一个*(任意但特定)元素。 –