ありがとうございます。みてみます。
$ ghc --version The Glorious Glasgow Haskell Compilation System, version 8.6.5 $ stack path --compiler-bin ~/.stack/programs/x86_64-osx/ghc-8.6.5/bin $ which hie ~/.local/bin/hie $ ~/haskell-ide-engine/.stack-work/install/x86_64-osx/hogehogehoge/8.6.5/bin/cabal-helper-wrapper "print-build-platform" x86_64-osx
1. ブラウザからDLした古い verison の vscode を rm コマンドで削除 2. brew cask install visual-studio-code
http-client
の`Network.Http.Simple.httpJSON` について質問ですRight
、それ以外なら Left
に包んで返したいです。response
に getResponseBody
を使うと、強制的に成功時の型として扱われてパースできずにエラーになってしまい、困っています。httpJSON
の代わりに httpLbs
を使い、最後値を返すときにJSONとしてパースする」くらいなのですが他に方法はあるのでしょうかusersShow :: APIRequest -> ReaderT MisskeyEnv IO (Either APIError User) usersShow req = do env <- ask initReq <- parseRequest $ (env^.url) ++ "/api/users/show" let requestObject = object [ "userId" .= (req^.userId) , "userIds" .= (req^.userIds) , "username" .= (req^.username) , "host" .= (req^.host) ] request = initReq { method = "POST" , requestBody = RequestBodyLBS $ encode requestObject , requestHeaders = [("Content-Type", "application/json; charset=utf-8")] } response <- httpJSON request case getResponseStatusCode response of 200 -> return $ Right $ getResponseBody response 400 -> return $ Left $ getResponseBody response -- APIError型になって欲しいけどならない
newtype EitherJson a b = EitherJson (Either a b) instance (FromJSON a, FromJSON b) => FromJSON (EitherJson a b) where parseJSON v = EitherJson <$> (Right <$> parseJSON v) <|> (Left <$> parseJSON v)
foldr'
が Data.List
にない(`Data.Foldable` から import
すれば使えますが、普通使うことはないはず) のってなんででしたっけ?+!
を右から評価するものとして表すと`1 +! 2 +! (3 +! 0)` のような形になります。結局、この式を評価するには最後まで辿ってスタックを消費せねばならず、メリットがないからだと言えますx : xs
における x
と xs
の分だけスタックを消費してる、というイメージで合ってますかね?+!
がeagerにパターンマッチするからリストの長さだけスタックを消費してる、と。exL = exL'
foldl' (+) 0 [1..1000]
と foldl (+) 0 [1..1000]
は同じ式として最適化されたってことですか... 正格性解析の結果でしょうか... すごい。