{"id":20182190,"url":"https://github.com/nichoth/functional-friday","last_synced_at":"2025-10-11T17:03:27.659Z","repository":{"id":77400035,"uuid":"100913022","full_name":"nichoth/functional-friday","owner":"nichoth","description":"Learning about haskell","archived":false,"fork":false,"pushed_at":"2017-08-22T03:53:41.000Z","size":11,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-05T07:59:53.617Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nichoth.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-08-21T04:40:45.000Z","updated_at":"2018-01-31T22:16:41.000Z","dependencies_parsed_at":null,"dependency_job_id":"e3c28ac8-e552-49e4-a0f6-b8ec9dd00b88","html_url":"https://github.com/nichoth/functional-friday","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/nichoth/functional-friday","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nichoth%2Ffunctional-friday","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nichoth%2Ffunctional-friday/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nichoth%2Ffunctional-friday/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nichoth%2Ffunctional-friday/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nichoth","download_url":"https://codeload.github.com/nichoth/functional-friday/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nichoth%2Ffunctional-friday/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279008113,"owners_count":26084396,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-11T02:00:06.511Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-14T02:37:54.019Z","updated_at":"2025-10-11T17:03:27.627Z","avatar_url":"https://github.com/nichoth.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# functional friday\n\nThis is where we learn about Haskell on friday evenings. As a learning project we can make a client for the SSB network.\n\n## send a message on the ssb network\n\n* how do you use command line args?\n* how do you parse and encode json?\n* how to send a network request?\n\n\n## questions and stuff\n\nInput is read lazily, meaning that a file is only buffered as it is needed, not all at once. This looks like a stream in node, but seems more baked into the language here. I think this means that *backpressure* is also the default, since the speed at which the input is buffered depends on the speed of it being processed.\n\n----------------------------------------\n\nThe syntax for converting between IO and values is terse. This code prints the command line args. The type of `putStrLn` is `putStrLn :: String -\u003e IO ()`. The type of `getArgs` is `getArgs :: IO [String]`. So `putStrLn` takes a string, but `getArgs` returns an IO of strings. `=\u003c\u003c` takes the IO action and gets the value and sends it to `putStrLn`. What happens if there is an error? Would `getArgs` need a different type signature?\n\n```haskell\nmain = do\n    mapM_ putStrLn =\u003c\u003c getArgs\n```\n\nThe JS equivalent I think would be like\n\n```js\n    getArgs(args =\u003e console.log(args))\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnichoth%2Ffunctional-friday","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnichoth%2Ffunctional-friday","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnichoth%2Ffunctional-friday/lists"}