The fact that the NYT thought the guy was worthy of a profile is yet another piece of evidence that I should never have given that paper money in the first place.
110 karma · joined November 7, 2015
The fact that the NYT thought the guy was worthy of a profile is yet another piece of evidence that I should never have given that paper money in the first place.
I did use AI to proofread the article, and implemented its primary suggestion (turning down a dark joke at my own expense that was pretty out of place), but the first draft of this was 100% hand-written.
They also changed their content rules to allow drastically more content, which reduces the total amount of work to be done. You could argue that this is a good thing because the moderation was useless and censoring before, but the moderation also made it a friendlier place for major advertisers who have since pulled out—so changing the moderation resulted in a business model change. That's naturally going to reduce headcount.
reserve :: (SearchTrains :> es, GetTypology :> es, Log :> es, RequestReservation :> es) => ReservationRequest -> Eff es ReservationResult
reserve request = do
trains <- send (SearchTrain (_dateTime request)) -- Search for trains at date-time
forM trains $ \train -> -- Loop on all the trains
typology <- send (GetTypology train) -- Get the typology of a train
... -- Implement the reservation rules
send (Log "Confirming reservation")
confirmed <- send (RequestReservation reservation)
...
(In actual usage you won't tend to use the send function - you'll write wrappers that do it for you).This lets you avoid having to write an interpreter for some particular ReservationExpr monad - instead, you specify individual effect handlers, then use them as you want. For example, we could write something like this:
-- Make search train never return any trains
runWithoutTrains :: Eff (SearchTrains ': es) a -> Eff es a
runWithoutTrains = interpret $ \_unusedHere (SearchTrain name) -> pure []
ignoreLogs :: Eff (Log ': es) a -> Eff es a
ignoreLogs = interpret $ \_unusedHere (Log _message) -> pure ()
What's even more fun is that you can actually interpose effects. So, I can write this: loggingTrainSearches :: (Log :> es, SearchTrain :> es) => Eff es a -> Eff es a
loggingTrainSearches = interpose $ \_unusedHere (SearchTrain name) -> do
send (Log ("Searching for train " <> show name))
send (SearchTrain name)
Being able to play around with handlers like this is really useful, both for testing and for adding on niceties to business logic.Ultimately, I think it's a good, necessary move. Linux on the desktop will only happen when the environment is at least as uniform as that of Windows—from the perspective of application developers, at least.
I'd say a website with 100 million members is worth far more than 4x as much as a site with 26.
Shameless plug: I've been stealth-working on an art site for several years, so you could try that out if you'd like. That's at https://www.imagehex.com/.