{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreiexanyvqpd7yhw7fteb47z7ivo234whkahwhz6p6wgvzujbduo34i",
    "uri": "at://did:plc:pi6woz4d47bkuws673w2il2r/app.bsky.feed.post/3mhfgxtiz4b32"
  },
  "path": "/t/rfc-sibyl-time-series-analysis-in-haskell/13823#post_2",
  "publishedAt": "2026-03-18T23:37:53.000Z",
  "site": "https://discourse.haskell.org",
  "textContent": "My initial intuition has two recommendations.\n\nFirstly, you could predominantly use the “safe” functions in the package, and then expose a convenience module which use TH or similar to just generate `either (error …) id . f` variants. This would let people use the safe stuff if they wanted, but those who want a grab bag of useful functions can use them and accept the risks.\n\nSecondly, I see you use a `|>` piping operator. I wonder whether you could do some kind of effects-system like thing where you can plumb together all your combinators in the scripter fashion, but the way you interpret it is how you get the key difference. For scripters, working in `IO` is likely ok, so all errors can be chucked into `fail` or similar immediately, but for those who want stronger guarantees you can let the monad go to `Either err` or some other custom stack.\n\nThis second approach may have the annoying effect of making pure functions you wish to compose have to exist within a Monad, but with sufficiently general constraints (`Applicative` or `Monad`) you could simplify to `Identity` in some cases; maybe these pure functions have their monadic counterparts suffixed with `M`?",
  "title": "[RFC] Sibyl: Time Series Analysis in Haskell"
}