我的问题与另一个问题的答案有关:https://stackoverflow.com/a/11766789/3212958
在他的回答中,ertes写下了以下类型的签名
select :: [a] -> [(a, [a])]
Run Code Online (Sandbox Code Playgroud)
但是,当select实际使用时,ertes会在do块内写入以下内容
(y, ys) <- select xs
Run Code Online (Sandbox Code Playgroud)
请帮助我阐明元组如何(y, ys)匹配select的返回类型,即[(a, [a])].Haskell在某些时候强迫这些类型吗?(Haskell是否强制类型?)从返回的列表monad中<-提取类型的元组?(a, [a])select
谢谢,马克斯
---编辑:---
@Lee在尝试推理类型之前提醒newbs去desugar.在>>=明确表示之后,更清楚的是发生了什么.脱毒后,有问题的功能如下:
select xs >>= \(y, ys) -> fmap (y:) (perms (n - 1) ys)
Run Code Online (Sandbox Code Playgroud)
而对于名单,xs >>= f = concat (map f xs).因此,(y, ys)在此上下文中更好的阅读是作为映射列表的函数的签名.