Может кто-нибудь объяснить, как написать этот FSharpx stm в качестве конвейера?Как написать F # stm как >> = конвейер
stm {
let! allTops = readTVar tAllTops
let! thisPlayerTops = mapM removeOtherPlayersScores allTops
let! markedTops = mapM markAsNonEmpty thisPlayerTops
return
markedTops
|> Seq.filter fst
|> Seq.map snd
|> List.ofSeq
}
Я думаю о haskell-like >> = трубопроводах.
Спасибо!
UPDATE: Немного разъяснений для того, чтобы избежать путаницы:
Я думал, что один должен быть в состоянии определить >> = оператор в F # в терминах stm.Bind и stm.Return , Я попытался сделать это сам, я заблудился.
UPDATE2: После ответа Томаса я публикую обновленную версию, которая, я думаю, выглядит довольно хорошо. Если я правильно понимаю, из-за отсутствия типов классов оператор >> = не имеет такой же мощности, как в Haskell.
Я согласен, что это не идиоматично для F #, но это, вероятно, хорошее упражнение.
readTVar tAllTops
>>= mapM removeOtherPlayersScores
>>= mapM markAsNonEmpty
>>= stm.Return >> Seq.filter fst >> Seq.map snd >> List.ofSeq
|> atomically
Спасибо!
Я не был уверен, как я должен был читать stm.Bind типа. Я добавил обновленное решение на основе вашего оператора >> = Спасибо! – vidi