我的問題涉及回答另一個問題: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」表示列表中的一個*(任意但特定)元素。 –