I’m learning F# and trying to find a more ‘functional’ way to code a simple program that retrieves the price of BTC and calculates the EUR value of an amount of Bitcoin.

open System
open System.Net
open Newtonsoft.Json.Linq

let myBTC = 0.1234567
let client = new WebClient()
client.UseDefaultCredentials = true
let priceInfo = client.DownloadString("https://blockchain.info/ticker")
let jPrice = JObject.Parse priceInfo
let eurPrice = float (jPrice.["EUR"].["buy"] :?> JValue)
let calcWorth = myBTC * eurPrice
printfn "%s" calcWorth.ToString("N")

My take is that there is no harm in adding a few named functions. Also it is probably better to ignore the result of setting a standard .net property.

open System
open System.Net
open Newtonsoft.Json.Linq

let downloadPriceInfo () =
    let client = new WebClient()

let getPriceOfEuro (price: JObject) = float (price.["EUR"].["buy"] :?> JValue)

let euroToBtc euro = 0.1234567 * euro

let btcOfEuro = 
    downloadPriceInfo () 
    |> JObject.Parse
    |> getPriceOfEuro 
    |> euroToBtc

printfn "%s" (btcOfEuro.ToString("N"))
|improve this answer|||||
  • 1
    \$\begingroup\$ Some suggestions, which may or may not be useful... |> parseJObject is equivalent to |> JObject.Parse. jPrice might better be named price since the type definition is fully specified here. euroPrice might be better named euro since the function is EuroToBtc. I'm pretty sure client.UseDefaultCredentials = true doesn't actually do anything. \$\endgroup\$ – VoronoiPotato Mar 13 '19 at 14:27
  • \$\begingroup\$ @VoronoiPotato - You make some good points. \$\endgroup\$ – ChaosPandion Mar 13 '19 at 16:29
  • \$\begingroup\$ always happy to help :) \$\endgroup\$ – VoronoiPotato Mar 15 '19 at 15:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.