Skip to content

Instantly share code, notes, and snippets.

@mgajda
Created August 24, 2019 14:19
Show Gist options
  • Save mgajda/59e3da925a52230903917519cab19c8c to your computer and use it in GitHub Desktop.
Save mgajda/59e3da925a52230903917519cab19c8c to your computer and use it in GitHub Desktop.
Reddit JSON data for Haskell subreddit
{"kind": "Listing", "data": {"modhash": "", "dist": 26, "children": [{"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "This is your opportunity to ask any questions you feel don't deserve their own threads, no matter how small or simple they might be!", "author_fullname": "t2_6l4z3", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Monthly Hask Anything (August 2019)", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_ckba3b", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 18, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 18, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": true, "mod_note": null, "created": 1564621598.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "self.haskell", "allow_live_comments": false, "selftext_html": "<!-- SC_OFF --><div class=\"md\"><p>This is your opportunity to ask any questions you feel don't deserve their own threads, no matter how small or simple they might be!</p>\n</div><!-- SC_ON -->", "likes": null, "suggested_sort": "new", "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": true, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": "moderator", "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "ckba3b", "is_robot_indexable": true, "report_reasons": null, "author": "AutoModerator", "num_crossposts": 0, "num_comments": 193, "send_replies": false, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/ckba3b/monthly_hask_anything_august_2019/", "parent_whitelist_status": "all_ads", "stickied": true, "url": "https://www.reddit.com/r/haskell/comments/ckba3b/monthly_hask_anything_august_2019/", "subreddit_subscribers": 45076, "created_utc": 1564592798.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "I'm excited to share my latest Haskell project, [Scarf](https://scarf.sh)! It's a way to distribute CLI tools, system packages, etc so that you can automatically capture usage statistics and easily collect payments from users.\n\nI built this for a problem I was having myself while trying to collect payments for my own Haskell projects. My own packages (toodles, curl-runnings, confetti) are now hosted on Scarf and it has been working well for me so far. I'm hoping it can be useful to others here.\n\nAny feedback would be very appreciated! If it's something you're interested in using for your projects, I'd love to help you get started.", "author_fullname": "t2_i8ekf", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Scarf - Distribute your system packages, understand how they are used, and make money from them", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_ctiopc", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 18, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 18, "approved_by": null, "thumbnail": "", "edited": 1566404404.0, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": true, "mod_note": null, "created": 1566431487.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "self.haskell", "allow_live_comments": false, "selftext_html": "<!-- SC_OFF --><div class=\"md\"><p>I'm excited to share my latest Haskell project, <a href=\"https://scarf.sh\">Scarf</a>! It's a way to distribute CLI tools, system packages, etc so that you can automatically capture usage statistics and easily collect payments from users.</p>\n\n<p>I built this for a problem I was having myself while trying to collect payments for my own Haskell projects. My own packages (toodles, curl-runnings, confetti) are now hosted on Scarf and it has been working well for me so far. I'm hoping it can be useful to others here.</p>\n\n<p>Any feedback would be very appreciated! If it's something you're interested in using for your projects, I'd love to help you get started.</p>\n</div><!-- SC_ON -->", "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "ctiopc", "is_robot_indexable": true, "report_reasons": null, "author": "aviaviaviavi", "num_crossposts": 0, "num_comments": 9, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/ctiopc/scarf_distribute_your_system_packages_understand/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://www.reddit.com/r/haskell/comments/ctiopc/scarf_distribute_your_system_packages_understand/", "subreddit_subscribers": 45076, "created_utc": 1566402687.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "", "author_fullname": "t2_1pko65xw", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Exploring Lisp's Fine-Grained Hierarchy with Comparisons to Haskell", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_ctk9gi", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 8, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 8, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": false, "mod_note": null, "created": 1566438236.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "alhassy.github.io", "allow_live_comments": false, "selftext_html": null, "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "ctk9gi", "is_robot_indexable": true, "report_reasons": null, "author": "moseswithhisbooks", "num_crossposts": 0, "num_comments": 0, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/ctk9gi/exploring_lisps_finegrained_hierarchy_with/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://alhassy.github.io/TypedLisp/", "subreddit_subscribers": 45076, "created_utc": 1566409436.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "", "author_fullname": "t2_vlnzl", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Book published: Property-Based Testing in a Screencast Editor", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_ctbpak", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 56, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 56, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": false, "mod_note": null, "created": 1566390097.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "leanpub.com", "allow_live_comments": false, "selftext_html": null, "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "ctbpak", "is_robot_indexable": true, "report_reasons": null, "author": "owickstrom", "num_crossposts": 0, "num_comments": 7, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/ctbpak/book_published_propertybased_testing_in_a/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://leanpub.com/property-based-testing-in-a-screencast-editor", "subreddit_subscribers": 45076, "created_utc": 1566361297.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "", "author_fullname": "t2_44gk01ti", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "HSoC \u2014 Hadrian Optimisation: Elusive Unused Imports", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_ctha6z", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 7, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 7, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": false, "mod_note": null, "created": 1566424915.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "link.medium.com", "allow_live_comments": false, "selftext_html": null, "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "ctha6z", "is_robot_indexable": true, "report_reasons": null, "author": "ratherforky", "num_crossposts": 0, "num_comments": 2, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/ctha6z/hsoc_hadrian_optimisation_elusive_unused_imports/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://link.medium.com/ORFcoPTPkZ", "subreddit_subscribers": 45076, "created_utc": 1566396115.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "", "author_fullname": "t2_xp3il", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Haskell Weekly Podcast episode 19: Profunctor Optics", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_ct3px3", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 16, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 16, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": false, "mod_note": null, "created": 1566354821.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "haskellweekly.news", "allow_live_comments": false, "selftext_html": null, "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "ct3px3", "is_robot_indexable": true, "report_reasons": null, "author": "haskellweekly", "num_crossposts": 0, "num_comments": 12, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/ct3px3/haskell_weekly_podcast_episode_19_profunctor/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://haskellweekly.news/podcast/episodes/19.html", "subreddit_subscribers": 45076, "created_utc": 1566326021.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "Are there any good Haskell libraries that can be used for parsing, changing and saving a .cabal file\n\nIt seems that cabal package can do that. http://hackage.haskell.org/package/Cabal\n\nAre there any better options? Or should I go with cabal?", "author_fullname": "t2_d23wc", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Haskell library for parsing, changing and saving a .cabal file", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_ct2rn1", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 7, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 7, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": true, "mod_note": null, "created": 1566351308.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "self.haskell", "allow_live_comments": false, "selftext_html": "<!-- SC_OFF --><div class=\"md\"><p>Are there any good Haskell libraries that can be used for parsing, changing and saving a .cabal file</p>\n\n<p>It seems that cabal package can do that. <a href=\"http://hackage.haskell.org/package/Cabal\">http://hackage.haskell.org/package/Cabal</a></p>\n\n<p>Are there any better options? Or should I go with cabal?</p>\n</div><!-- SC_ON -->", "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "ct2rn1", "is_robot_indexable": true, "report_reasons": null, "author": "razvanpanda", "num_crossposts": 0, "num_comments": 4, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/ct2rn1/haskell_library_for_parsing_changing_and_saving_a/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://www.reddit.com/r/haskell/comments/ct2rn1/haskell_library_for_parsing_changing_and_saving_a/", "subreddit_subscribers": 45076, "created_utc": 1566322508.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "I've managed to install *wxHaskell* (the latest version, from GitHub) perfectly easily the old-fashioned, global way, but I was hoping to get it working with the new-style workflow, for obvious reasons.\n\nAfter building *wxdirect* and *wxc,* cabal fails building *wxcore*, with the error: \n`setup: Missing dependency on a foreign library:` \n`Missing (or bad) C library: wxc`\n\nUsing `-v3` seems to reveal that this is down to a linker error: \n`/usr/bin/ld.gold: error: cannot find -lwxc`\n\nI'm happy for now with a solution that involves manually moving around the *wxc* library files (in the long run, it would be possible to incorporate this into the *Setup* script and make a pull request), but I can't work out what to put where, in order for cabal to find what it needs.\n\nUsing GHC 8.6.5, cabal 2.4.1.0, Ubuntu 16.\n\nPS. Does anyone know why the Hackage package hasn't been updated in over two years, despite development still being somewhat active?", "author_fullname": "t2_el1wqq2", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Has anyone managed to use wxHaskell with cabal new-build?", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_ct0id2", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 5, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 5, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": true, "mod_note": null, "created": 1566342961.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "self.haskell", "allow_live_comments": false, "selftext_html": "<!-- SC_OFF --><div class=\"md\"><p>I've managed to install <em>wxHaskell</em> (the latest version, from GitHub) perfectly easily the old-fashioned, global way, but I was hoping to get it working with the new-style workflow, for obvious reasons.</p>\n\n<p>After building <em>wxdirect</em> and <em>wxc,</em> cabal fails building <em>wxcore</em>, with the error:<br/>\n<code>setup: Missing dependency on a foreign library:</code><br/>\n<code>Missing (or bad) C library: wxc</code></p>\n\n<p>Using <code>-v3</code> seems to reveal that this is down to a linker error:<br/>\n<code>/usr/bin/ld.gold: error: cannot find -lwxc</code></p>\n\n<p>I'm happy for now with a solution that involves manually moving around the <em>wxc</em> library files (in the long run, it would be possible to incorporate this into the <em>Setup</em> script and make a pull request), but I can't work out what to put where, in order for cabal to find what it needs.</p>\n\n<p>Using GHC 8.6.5, cabal 2.4.1.0, Ubuntu 16.</p>\n\n<p>PS. Does anyone know why the Hackage package hasn't been updated in over two years, despite development still being somewhat active?</p>\n</div><!-- SC_ON -->", "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "ct0id2", "is_robot_indexable": true, "report_reasons": null, "author": "george_____t", "num_crossposts": 0, "num_comments": 4, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/ct0id2/has_anyone_managed_to_use_wxhaskell_with_cabal/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://www.reddit.com/r/haskell/comments/ct0id2/has_anyone_managed_to_use_wxhaskell_with_cabal/", "subreddit_subscribers": 45076, "created_utc": 1566314161.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "Hi all,\n\nDo we have already a syntax like for 'foo, but that also contains a typed value?\n\nI have e.g. an AST that I want to do more static checks on it that aren\u2019t as convenient to do in the type system. Here\u2019s an example:\n\n -- | Check the grammar spec to produce a grammar.\n checkGrammar :: (SchemaName, [(SchemaName, Schema)]) -> Q Exp\n checkGrammar (toplevel, rules) =\n if M.size rulesMap /= length rules\n then error \"Duplicate rule names in grammar.\"\n else lift (Grammar {grammarToplevel = toplevel, grammarRules = rulesMap})\n where\n rulesMap = M.fromList rules\n\n -- | Grammar for Haskell.\n grammar :: Grammar\n grammar = $(checkGrammar $ runDefine $ mdo\n -- General expression\n expression <- rule \"Expression\" (ChoiceSchema [variable, constructor, parentheses\n ,tuple, let', application, string])\n application <- rule \"Application\" (CompositeSchema [expression, expression])\n parentheses <- rule \"Parentheses\" (CompositeSchema [openParenSchema, expression, closeParenSchema])\n\n ...\n pure expression)\n\nHere I do a trivial check for duplicates. After I\u2019ve checked the\nexpression at compile-time, I `Lift` it so that it can be used at\nruntime. That\u2019s pretty good. But some types like `(a -> b)` don\u2019t\n`Lift`. So an alternative would be:\n\n grammar = $(checkGrammar_take2 thename 'thename)\n\nIn which checkGrammar_take2 would:\n\n1. Use thename at compile-time for a check.\n2. If the check passes, then return (VarE thename)\n\nE.g.\n\n checkGrammar_take2 value name = if valueFine value then varE name else\n error \"value isn't fine\"\n\nThat\u2019s actually quite a good solution because it avoids a lift, and I\ndidn\u2019t transform the AST. It's also more efficient than lifting.\n\nBut there\u2019s no checked relationship between `thename` and `'thename`.\n`checkGrammar_take2` has no way of knowing that they refer to the same\nthing. See?\n\nHence, if I could get e.g. `thename to produce both the value and a\nname for the value, that would be cool. It might look like this:\n\n checkGrammar_take2 namedValue = if valueFine (getValue namedValue) then getExp namedValue else error \"value isn't fine\"\n\nand call it like:\n\n mygrammar = $(checkGrammar_take2 `thename)\n\nSo the semantics would be roughly similar to\n\n[|| thename ||] :: TExp a\n\nbut you'd get\n\n `thename :: Named a\n\nwhere\n\n data Named a = { namedThing :: a, nameOfThing :: Name }\n\nI feel like the more DSLs I design, the more I\u2019d like something like this to perform my static checks.", "author_fullname": "t2_56gpp", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Getting both the value and name of a variable in one expression [xpost haskell-cafe]", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_ct1umn", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 2, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 2, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": true, "mod_note": null, "created": 1566347942.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "self.haskell", "allow_live_comments": false, "selftext_html": "<!-- SC_OFF --><div class=\"md\"><p>Hi all,</p>\n\n<p>Do we have already a syntax like for 'foo, but that also contains a typed value?</p>\n\n<p>I have e.g. an AST that I want to do more static checks on it that aren\u2019t as convenient to do in the type system. Here\u2019s an example:</p>\n\n<pre><code>-- | Check the grammar spec to produce a grammar.\ncheckGrammar :: (SchemaName, [(SchemaName, Schema)]) -> Q Exp\ncheckGrammar (toplevel, rules) =\n if M.size rulesMap /= length rules\n then error "Duplicate rule names in grammar."\n else lift (Grammar {grammarToplevel = toplevel, grammarRules = rulesMap})\n where\n rulesMap = M.fromList rules\n\n-- | Grammar for Haskell.\ngrammar :: Grammar\ngrammar = $(checkGrammar $ runDefine $ mdo\n -- General expression\n expression <- rule "Expression" (ChoiceSchema [variable, constructor, parentheses\n ,tuple, let', application, string])\n application <- rule "Application" (CompositeSchema [expression, expression])\n parentheses <- rule "Parentheses" (CompositeSchema [openParenSchema, expression, closeParenSchema])\n\n...\n pure expression)\n</code></pre>\n\n<p>Here I do a trivial check for duplicates. After I\u2019ve checked the\nexpression at compile-time, I <code>Lift</code> it so that it can be used at\nruntime. That\u2019s pretty good. But some types like <code>(a -> b)</code> don\u2019t\n<code>Lift</code>. So an alternative would be:</p>\n\n<pre><code>grammar = $(checkGrammar_take2 thename 'thename)\n</code></pre>\n\n<p>In which checkGrammar_take2 would:</p>\n\n<ol>\n<li>Use thename at compile-time for a check.</li>\n<li>If the check passes, then return (VarE thename)</li>\n</ol>\n\n<p>E.g.</p>\n\n<pre><code>checkGrammar_take2 value name = if valueFine value then varE name else\nerror "value isn't fine"\n</code></pre>\n\n<p>That\u2019s actually quite a good solution because it avoids a lift, and I\ndidn\u2019t transform the AST. It's also more efficient than lifting.</p>\n\n<p>But there\u2019s no checked relationship between <code>thename</code> and <code>'thename</code>.\n<code>checkGrammar_take2</code> has no way of knowing that they refer to the same\nthing. See?</p>\n\n<p>Hence, if I could get e.g. `thename to produce both the value and a\nname for the value, that would be cool. It might look like this:</p>\n\n<pre><code>checkGrammar_take2 namedValue = if valueFine (getValue namedValue) then getExp namedValue else error "value isn't fine"\n</code></pre>\n\n<p>and call it like:</p>\n\n<pre><code>mygrammar = $(checkGrammar_take2 `thename)\n</code></pre>\n\n<p>So the semantics would be roughly similar to</p>\n\n<p>[|| thename ||] :: TExp a</p>\n\n<p>but you'd get</p>\n\n<pre><code>`thename :: Named a\n</code></pre>\n\n<p>where</p>\n\n<pre><code>data Named a = { namedThing :: a, nameOfThing :: Name }\n</code></pre>\n\n<p>I feel like the more DSLs I design, the more I\u2019d like something like this to perform my static checks.</p>\n</div><!-- SC_ON -->", "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "ct1umn", "is_robot_indexable": true, "report_reasons": null, "author": "chrisdoner", "num_crossposts": 0, "num_comments": 0, "send_replies": false, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/ct1umn/getting_both_the_value_and_name_of_a_variable_in/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://www.reddit.com/r/haskell/comments/ct1umn/getting_both_the_value_and_name_of_a_variable_in/", "subreddit_subscribers": 45076, "created_utc": 1566319142.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "I'm going through the Beam tutorials, and about halfway through part 2 I've hit a type error I cannot resolve. I'm hoping someone can point me in the right direction.\n\nIn part 1, we set up a users table, insert some users with `insertValues`, and run a few queries.\n\nIn [part 2](https://tathougies.github.io/beam/tutorials/tutorial2/), we add a table of user addresses and insert some rows using `insertExpressions`. I'm running into type errors in the call to `insertExpressions`: (https://github.com/ivanbrennan/haskell-beam-quickie/commit/36949926fa3e4415b5a4d7aa3a9b147978a69f87)\n\nAs far as I can tell, the problem stems from the parametric `f` in `AddressT f`. I'm passing a list of `AddressT Identity` values, but `insertExpressions` expects a list of `AddressT QExpr Sqlite s` expressions. Is the tutorial simply wrong, or is there some nuance I'm overlooking?", "author_fullname": "t2_4jglo", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Type error in Beam tutorial part 2", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_csx43a", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 3, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 3, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": true, "mod_note": null, "created": 1566329383.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "self.haskell", "allow_live_comments": false, "selftext_html": "<!-- SC_OFF --><div class=\"md\"><p>I'm going through the Beam tutorials, and about halfway through part 2 I've hit a type error I cannot resolve. I'm hoping someone can point me in the right direction.</p>\n\n<p>In part 1, we set up a users table, insert some users with <code>insertValues</code>, and run a few queries.</p>\n\n<p>In <a href=\"https://tathougies.github.io/beam/tutorials/tutorial2/\">part 2</a>, we add a table of user addresses and insert some rows using <code>insertExpressions</code>. I'm running into type errors in the call to <code>insertExpressions</code>: (<a href=\"https://github.com/ivanbrennan/haskell-beam-quickie/commit/36949926fa3e4415b5a4d7aa3a9b147978a69f87\">https://github.com/ivanbrennan/haskell-beam-quickie/commit/36949926fa3e4415b5a4d7aa3a9b147978a69f87</a>)</p>\n\n<p>As far as I can tell, the problem stems from the parametric <code>f</code> in <code>AddressT f</code>. I'm passing a list of <code>AddressT Identity</code> values, but <code>insertExpressions</code> expects a list of <code>AddressT QExpr Sqlite s</code> expressions. Is the tutorial simply wrong, or is there some nuance I'm overlooking?</p>\n</div><!-- SC_ON -->", "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "csx43a", "is_robot_indexable": true, "report_reasons": null, "author": "roboboticus", "num_crossposts": 0, "num_comments": 7, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/csx43a/type_error_in_beam_tutorial_part_2/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://www.reddit.com/r/haskell/comments/csx43a/type_error_in_beam_tutorial_part_2/", "subreddit_subscribers": 45076, "created_utc": 1566300583.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "", "author_fullname": "t2_8xyym", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "ICFP Live Stream", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_csesj3", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 60, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 60, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": false, "mod_note": null, "created": 1566236323.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "ventotene.conf.meetecho.com", "allow_live_comments": false, "selftext_html": null, "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "csesj3", "is_robot_indexable": true, "report_reasons": null, "author": "jmite", "num_crossposts": 0, "num_comments": 1, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/csesj3/icfp_live_stream/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://ventotene.conf.meetecho.com/icfp/", "subreddit_subscribers": 45076, "created_utc": 1566207523.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "", "author_fullname": "t2_39zck", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "MPC 2019 - Call for Participation", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_csexde", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 12, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 12, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": false, "mod_note": null, "created": 1566237278.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "cs.nott.ac.uk", "allow_live_comments": false, "selftext_html": null, "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "csexde", "is_robot_indexable": true, "report_reasons": null, "author": "grahamhutton", "num_crossposts": 0, "num_comments": 1, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/csexde/mpc_2019_call_for_participation/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "http://www.cs.nott.ac.uk/~pszgmh/mpc19.html", "subreddit_subscribers": 45076, "created_utc": 1566208478.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "", "author_fullname": "t2_2zl2", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "A reckless introduction to Hindley-Milner type inference", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_cs7jyu", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 59, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 59, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": false, "mod_note": null, "created": 1566193331.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "reasonableapproximation.net", "allow_live_comments": false, "selftext_html": null, "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "cs7jyu", "is_robot_indexable": true, "report_reasons": null, "author": "philh", "num_crossposts": 0, "num_comments": 30, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/cs7jyu/a_reckless_introduction_to_hindleymilner_type/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "http://reasonableapproximation.net/2019/05/05/hindley-milner.html", "subreddit_subscribers": 45076, "created_utc": 1566164531.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "Hi, I am trying to build a sample Rest API project using Spock ([https://www.spock.li/tutorials/rest-api](https://www.spock.li/tutorials/rest-api)).. when I build the project using cabal new-build by adding the list of dependencies, I get the following error \"Could not find module 'Web.Routing.AbstractRouter'\" \n\nDependencies Added:\n\nbuild-depends: base >=4.12 && <4.13, aeson, Spock, text, monad-logger, persistent, persistent-sqlite, persistent-template\n\nError: \n\n​\n\n>Building library for Spock-0.9.0.1.. \n> \n>on the commandline: warning: \n> \n>\\-auto-all is deprecated: Use -fprof-auto instead \n> \n>\\[ 1 of 12\\] Compiling Web.Spock.Internal.Util ( src/Web/Spock/Internal/Util.hs, dist/build/Web/Spock/Internal/Util.o ) \n> \n>\\[ 2 of 12\\] Compiling Web.Spock.Internal.Wire ( src/Web/Spock/Internal/Wire.hs, dist/build/Web/Spock/Internal/Wire.o ) \n> \n>src/Web/Spock/Internal/Wire.hs:43:1: error: \n> \n>Could not find module \u2018Web.Routing.AbstractRouter\u2019 \n> \n>Use -v to see a list of the files searched for. \n> \n>| \n> \n>43 | import Web.Routing.AbstractRouter \n> \n>| \\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^\\^ \n> \n>cabal: Failed to build Spock-0.9.0.1 (which is required by exe:Test-Spock from \n> \n>Test-Spock-0.1.0.0). See the build log above for details.", "author_fullname": "t2_4a314ctp", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Build error when trying Haskell Spock tutorial", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_cs5sc3", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 5, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 5, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": true, "mod_note": null, "created": 1566185220.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "self.haskell", "allow_live_comments": false, "selftext_html": "<!-- SC_OFF --><div class=\"md\"><p>Hi, I am trying to build a sample Rest API project using Spock (<a href=\"https://www.spock.li/tutorials/rest-api\">https://www.spock.li/tutorials/rest-api</a>).. when I build the project using cabal new-build by adding the list of dependencies, I get the following error "Could not find module 'Web.Routing.AbstractRouter'" </p>\n\n<p>Dependencies Added:</p>\n\n<p>build-depends: base >=4.12 && <4.13, aeson, Spock, text, monad-logger, persistent, persistent-sqlite, persistent-template</p>\n\n<p>Error: </p>\n\n<p>​</p>\n\n<blockquote>\n<p>Building library for Spock-0.9.0.1.. </p>\n\n<p>on the commandline: warning: </p>\n\n<p>-auto-all is deprecated: Use -fprof-auto instead </p>\n\n<p>[ 1 of 12] Compiling Web.Spock.Internal.Util ( src/Web/Spock/Internal/Util.hs, dist/build/Web/Spock/Internal/Util.o ) </p>\n\n<p>[ 2 of 12] Compiling Web.Spock.Internal.Wire ( src/Web/Spock/Internal/Wire.hs, dist/build/Web/Spock/Internal/Wire.o ) </p>\n\n<p>src/Web/Spock/Internal/Wire.hs:43:1: error: </p>\n\n<p>Could not find module \u2018Web.Routing.AbstractRouter\u2019 </p>\n\n<p>Use -v to see a list of the files searched for. </p>\n\n<table><thead>\n<tr>\n</tr>\n</thead><tbody>\n<tr>\n</tr>\n</tbody></table>\n\n<p>| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ </p>\n\n<p>cabal: Failed to build Spock-0.9.0.1 (which is required by exe:Test-Spock from </p>\n\n<p>Test-Spock-0.1.0.0). See the build log above for details.</p>\n</blockquote>\n</div><!-- SC_ON -->", "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": true, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "cs5sc3", "is_robot_indexable": true, "report_reasons": null, "author": "VinothJustin", "num_crossposts": 0, "num_comments": 5, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/cs5sc3/build_error_when_trying_haskell_spock_tutorial/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://www.reddit.com/r/haskell/comments/cs5sc3/build_error_when_trying_haskell_spock_tutorial/", "subreddit_subscribers": 45076, "created_utc": 1566156420.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "", "author_fullname": "t2_lpg3f", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "All the Monadic Party 2019 talks are on YouTube", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_crphk7", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 135, "total_awards_received": 0, "media_embed": {"content": "<iframe class=\"embedly-embed\" src=\"https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fvideoseries%3Flist%3DPLcAu_kKy-krxDD1WwRX_9rc0knAFK3nHs&url=https%3A%2F%2Fwww.youtube.com%2Fplaylist%3Flist%3DPLcAu_kKy-krxDD1WwRX_9rc0knAFK3nHs&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FeuEacUD6jQQ%2Fhqdefault.jpg%3Fsqp%3D-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ%3D%3D%26rs%3DAOn4CLAvabcSshMSKReCljnzAjIdn5DEuA&key=ed8fa8699ce04833838e66ce79ba05f1&type=text%2Fhtml&schema=youtube\" width=\"600\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen=\"true\"></iframe>", "width": 600, "scrolling": false, "height": 450}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": {"oembed": {"provider_url": "http://youtube.com", "description": "Alexey Kuleshevich - Haskell Arrays with Massiv 1/6", "title": "Monadic Party 2019 - YouTube", "thumbnail_width": 480, "height": 450, "width": 600, "html": "<iframe class=\"embedly-embed\" src=\"https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fvideoseries%3Flist%3DPLcAu_kKy-krxDD1WwRX_9rc0knAFK3nHs&url=https%3A%2F%2Fwww.youtube.com%2Fplaylist%3Flist%3DPLcAu_kKy-krxDD1WwRX_9rc0knAFK3nHs&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FeuEacUD6jQQ%2Fhqdefault.jpg%3Fsqp%3D-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ%3D%3D%26rs%3DAOn4CLAvabcSshMSKReCljnzAjIdn5DEuA&key=ed8fa8699ce04833838e66ce79ba05f1&type=text%2Fhtml&schema=youtube\" width=\"600\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen=\"true\"></iframe>", "version": "1.0", "provider_name": "YouTube", "thumbnail_url": "https://i.ytimg.com/vi/euEacUD6jQQ/hqdefault.jpg?sqp=-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLAvabcSshMSKReCljnzAjIdn5DEuA", "type": "video", "thumbnail_height": 270}, "type": "youtube.com"}, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {"content": "<iframe class=\"embedly-embed\" src=\"https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fvideoseries%3Flist%3DPLcAu_kKy-krxDD1WwRX_9rc0knAFK3nHs&url=https%3A%2F%2Fwww.youtube.com%2Fplaylist%3Flist%3DPLcAu_kKy-krxDD1WwRX_9rc0knAFK3nHs&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FeuEacUD6jQQ%2Fhqdefault.jpg%3Fsqp%3D-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ%3D%3D%26rs%3DAOn4CLAvabcSshMSKReCljnzAjIdn5DEuA&key=ed8fa8699ce04833838e66ce79ba05f1&type=text%2Fhtml&schema=youtube\" width=\"600\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen=\"true\"></iframe>", "width": 600, "scrolling": false, "media_domain_url": "https://www.redditmedia.com/mediaembed/crphk7", "height": 450}, "link_flair_text": null, "can_mod_post": false, "score": 135, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": false, "mod_note": null, "created": 1566093253.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "youtube.com", "allow_live_comments": false, "selftext_html": null, "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "crphk7", "is_robot_indexable": true, "report_reasons": null, "author": "b4zzl3", "num_crossposts": 1, "num_comments": 19, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/crphk7/all_the_monadic_party_2019_talks_are_on_youtube/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://www.youtube.com/playlist?list=PLcAu_kKy-krxDD1WwRX_9rc0knAFK3nHs", "subreddit_subscribers": 45076, "created_utc": 1566064453.0, "discussion_type": null, "media": {"oembed": {"provider_url": "http://youtube.com", "description": "Alexey Kuleshevich - Haskell Arrays with Massiv 1/6", "title": "Monadic Party 2019 - YouTube", "thumbnail_width": 480, "height": 450, "width": 600, "html": "<iframe class=\"embedly-embed\" src=\"https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fvideoseries%3Flist%3DPLcAu_kKy-krxDD1WwRX_9rc0knAFK3nHs&url=https%3A%2F%2Fwww.youtube.com%2Fplaylist%3Flist%3DPLcAu_kKy-krxDD1WwRX_9rc0knAFK3nHs&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FeuEacUD6jQQ%2Fhqdefault.jpg%3Fsqp%3D-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ%3D%3D%26rs%3DAOn4CLAvabcSshMSKReCljnzAjIdn5DEuA&key=ed8fa8699ce04833838e66ce79ba05f1&type=text%2Fhtml&schema=youtube\" width=\"600\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen=\"true\"></iframe>", "version": "1.0", "provider_name": "YouTube", "thumbnail_url": "https://i.ytimg.com/vi/euEacUD6jQQ/hqdefault.jpg?sqp=-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLAvabcSshMSKReCljnzAjIdn5DEuA", "type": "video", "thumbnail_height": 270}, "type": "youtube.com"}, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "", "author_fullname": "t2_bhyg2d6", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "How to write a game in Haskell from scratch", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_crqnqz", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 58, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 58, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": false, "mod_note": null, "created": 1566098613.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "morgenthum.tech", "allow_live_comments": false, "selftext_html": null, "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "crqnqz", "is_robot_indexable": true, "report_reasons": null, "author": "dcast0", "num_crossposts": 1, "num_comments": 1, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/crqnqz/how_to_write_a_game_in_haskell_from_scratch/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "http://www.morgenthum.tech/articles/write-haskell-game", "subreddit_subscribers": 45076, "created_utc": 1566069813.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "I am happy to announce the Express library for Haskell.\n\n[https://github.com/rudymatela/express](https://github.com/rudymatela/express)\n\nExpress allows manipulation of dynamically typed Haskell expressions. It is similar to `Data.Dynamic` but with support for encoding applications and variables. It provides an `Expr` type and over a hundred functions for building, evaluating, comparing, folding, canonicalizing and matching `Expr`s. [Express' Haddock documentation](https://hackage.haskell.org/package/express/docs/Data-Express.html) is pretty comprehensive.\n\nThe project [README](https://github.com/rudymatela/express#readme) has a few examples showing how to use Express to:\n\n* create heterogeneous lists;\n* list valid applications between expressions;\n* generalize counterexamples;\n* automatically generate test properties.\n\nThis library has its origins as an internal module of [Speculate](https://github.com/rudymatela/speculate) and [Extrapolate](https://github.com/rudymatela/extrapolate), I am now releasing it separetely hoping that it could be used for other purposes.\n\nTo install it, just:\n\n $ cabal update\n $ cabal install express\n\nThen you're ready to use it:\n\n $ ghci\n > import Data.Express\n > let true = val True\n > :t true\n true :: Expr\n > print true\n True :: Bool\n > eval False true\n True", "author_fullname": "t2_30hoa4yf", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "[ANN] express-v0.1.2: manipulate dynamically typed Haskell expressions involving applications and variables", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_crp5y5", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 19, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 19, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": true, "mod_note": null, "created": 1566091857.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "self.haskell", "allow_live_comments": false, "selftext_html": "<!-- SC_OFF --><div class=\"md\"><p>I am happy to announce the Express library for Haskell.</p>\n\n<p><a href=\"https://github.com/rudymatela/express\">https://github.com/rudymatela/express</a></p>\n\n<p>Express allows manipulation of dynamically typed Haskell expressions. It is similar to <code>Data.Dynamic</code> but with support for encoding applications and variables. It provides an <code>Expr</code> type and over a hundred functions for building, evaluating, comparing, folding, canonicalizing and matching <code>Expr</code>s. <a href=\"https://hackage.haskell.org/package/express/docs/Data-Express.html\">Express' Haddock documentation</a> is pretty comprehensive.</p>\n\n<p>The project <a href=\"https://github.com/rudymatela/express#readme\">README</a> has a few examples showing how to use Express to:</p>\n\n<ul>\n<li>create heterogeneous lists;</li>\n<li>list valid applications between expressions;</li>\n<li>generalize counterexamples;</li>\n<li>automatically generate test properties.</li>\n</ul>\n\n<p>This library has its origins as an internal module of <a href=\"https://github.com/rudymatela/speculate\">Speculate</a> and <a href=\"https://github.com/rudymatela/extrapolate\">Extrapolate</a>, I am now releasing it separetely hoping that it could be used for other purposes.</p>\n\n<p>To install it, just:</p>\n\n<pre><code>$ cabal update\n$ cabal install express\n</code></pre>\n\n<p>Then you're ready to use it:</p>\n\n<pre><code>$ ghci\n> import Data.Express\n> let true = val True\n> :t true\ntrue :: Expr\n> print true\nTrue :: Bool\n> eval False true\nTrue\n</code></pre>\n</div><!-- SC_ON -->", "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "crp5y5", "is_robot_indexable": true, "report_reasons": null, "author": "rudymatela", "num_crossposts": 0, "num_comments": 6, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/crp5y5/ann_expressv012_manipulate_dynamically_typed/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://www.reddit.com/r/haskell/comments/crp5y5/ann_expressv012_manipulate_dynamically_typed/", "subreddit_subscribers": 45076, "created_utc": 1566063057.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "I need to parse type signatures and only type signatures. It doesn't need to be in perfect. \n\nAre there any libraries that do this, preferably without bringing in all of ghc-lib?", "author_fullname": "t2_17xbrps8", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Any libraries for parsing Haskell type signatures?", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_crsxaa", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 7, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 7, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": true, "mod_note": null, "created": 1566109540.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "self.haskell", "allow_live_comments": false, "selftext_html": "<!-- SC_OFF --><div class=\"md\"><p>I need to parse type signatures and only type signatures. It doesn't need to be in perfect. </p>\n\n<p>Are there any libraries that do this, preferably without bringing in all of ghc-lib?</p>\n</div><!-- SC_ON -->", "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "crsxaa", "is_robot_indexable": true, "report_reasons": null, "author": "avi-coder", "num_crossposts": 0, "num_comments": 2, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/crsxaa/any_libraries_for_parsing_haskell_type_signatures/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://www.reddit.com/r/haskell/comments/crsxaa/any_libraries_for_parsing_haskell_type_signatures/", "subreddit_subscribers": 45076, "created_utc": 1566080740.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "", "author_fullname": "t2_hxpbi", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Would you consider Haskell to be a minimalist language?", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_crrajk", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 7, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 7, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": true, "mod_note": null, "created": 1566101609.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "self.haskell", "allow_live_comments": false, "selftext_html": null, "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "crrajk", "is_robot_indexable": true, "report_reasons": null, "author": "Cock-tail", "num_crossposts": 0, "num_comments": 21, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/crrajk/would_you_consider_haskell_to_be_a_minimalist/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://www.reddit.com/r/haskell/comments/crrajk/would_you_consider_haskell_to_be_a_minimalist/", "subreddit_subscribers": 45076, "created_utc": 1566072809.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "As a Haskell beginner, I started writing a simple web app. It allows users to share code snippets with each other and comment on them.\n\nI started with designing the domain model and the web API using Servant and everything seemed perfect until I tried plugging in a real data store.\n\nThe users in my domain model look like this:\n\n```haskell\ntype UserId = UUID\n\ndata User =\n User\n { userId :: UserId\n , userUsername :: Username\n , userEmail :: Email\n , userPasswordHash :: PasswordHash\n , userSnippets :: Maybe [Snippet]\n , userComments :: Maybe [Comment]\n }\n```\n\nNothing fancy. The `Username`, `Email` and `PasswordHash` types are using smart constructors to ensure that the domain models are always in a valid state.\n\nThe problem arose when I tried to plug these to a real data storage.\n\nI looked into Haskell Beam, but it requires me to use weird Columnar types and it does not allow for collection properties. Also, I cannot have a Snippet collection tied to a user and perform a join query with it. (at least I couldn't figure out how)\n\nPostgresql-simple would be another valid choice, but it requires you to write raw SQL statements, which is really something I would avoid.\n\nHow can I preserve these domain models while making use of some ORM library and not pollute them with weird types or write raw SQL queries? I expected it to be something trivial, but I got completely lost.", "author_fullname": "t2_1jfr3jmr", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "How to avoid polluting your domain model when using some relational data store", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_crlc70", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 15, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 15, "approved_by": null, "thumbnail": "", "edited": 1566044769.0, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": true, "mod_note": null, "created": 1566072379.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "self.haskell", "allow_live_comments": false, "selftext_html": "<!-- SC_OFF --><div class=\"md\"><p>As a Haskell beginner, I started writing a simple web app. It allows users to share code snippets with each other and comment on them.</p>\n\n<p>I started with designing the domain model and the web API using Servant and everything seemed perfect until I tried plugging in a real data store.</p>\n\n<p>The users in my domain model look like this:</p>\n\n<p>```haskell\ntype UserId = UUID</p>\n\n<p>data User =\n User\n { userId :: UserId\n , userUsername :: Username\n , userEmail :: Email\n , userPasswordHash :: PasswordHash\n , userSnippets :: Maybe [Snippet]\n , userComments :: Maybe [Comment]\n }\n```</p>\n\n<p>Nothing fancy. The <code>Username</code>, <code>Email</code> and <code>PasswordHash</code> types are using smart constructors to ensure that the domain models are always in a valid state.</p>\n\n<p>The problem arose when I tried to plug these to a real data storage.</p>\n\n<p>I looked into Haskell Beam, but it requires me to use weird Columnar types and it does not allow for collection properties. Also, I cannot have a Snippet collection tied to a user and perform a join query with it. (at least I couldn't figure out how)</p>\n\n<p>Postgresql-simple would be another valid choice, but it requires you to write raw SQL statements, which is really something I would avoid.</p>\n\n<p>How can I preserve these domain models while making use of some ORM library and not pollute them with weird types or write raw SQL queries? I expected it to be something trivial, but I got completely lost.</p>\n</div><!-- SC_ON -->", "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "crlc70", "is_robot_indexable": true, "report_reasons": null, "author": "dnikolovv", "num_crossposts": 0, "num_comments": 31, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/crlc70/how_to_avoid_polluting_your_domain_model_when/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://www.reddit.com/r/haskell/comments/crlc70/how_to_avoid_polluting_your_domain_model_when/", "subreddit_subscribers": 45076, "created_utc": 1566043579.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "1. `putStrLn . init $ concat [\"Word \" ++ show i ++ \"\\n\" | i <- [1..15]`\n2. `putStrLn . concat $ intersperse \"\\n\" [\"Word \" ++ show i | i <- [1..15]]`\n\n​\n\n Word 1\n Word 2\n Word 3\n Word 4\n Word 5\n Word 6\n Word 7\n Word 8\n Word 9\n Word 10\n Word 11\n Word 12\n Word 13\n Word 14\n Word 15", "author_fullname": "t2_2xn891is", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "What are some other ways to get the following output, than these two below?", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_crjmwz", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 12, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 12, "approved_by": null, "thumbnail": "", "edited": 1566031173.0, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": true, "mod_note": null, "created": 1566059783.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "self.haskell", "allow_live_comments": false, "selftext_html": "<!-- SC_OFF --><div class=\"md\"><ol>\n<li><code>putStrLn . init $ concat ["Word " ++ show i ++ "\\n" | i <- [1..15]</code></li>\n<li><code>putStrLn . concat $ intersperse "\\n" ["Word " ++ show i | i <- [1..15]]</code></li>\n</ol>\n\n<p>​</p>\n\n<pre><code>Word 1\nWord 2\nWord 3\nWord 4\nWord 5\nWord 6\nWord 7\nWord 8\nWord 9\nWord 10\nWord 11\nWord 12\nWord 13\nWord 14\nWord 15\n</code></pre>\n</div><!-- SC_ON -->", "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "crjmwz", "is_robot_indexable": true, "report_reasons": null, "author": "enjayay", "num_crossposts": 0, "num_comments": 57, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/crjmwz/what_are_some_other_ways_to_get_the_following/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://www.reddit.com/r/haskell/comments/crjmwz/what_are_some_other_ways_to_get_the_following/", "subreddit_subscribers": 45076, "created_utc": 1566030983.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "[https://stackbuilders.workable.com/j/E01709D897](https://stackbuilders.workable.com/j/E01709D897)\n\n## DESCRIPTION\n\nStack Builders is an innovative software consultancy based in New York with offices in Quito, Ecuador. We deliver high-quality software and work on interesting projects with a diverse, dynamic and passionate environment. Our organization values intellectual curiosity, strong communication skills, and great programming abilities.\n\nFor this position, we are looking for a remote contractor with a very solid Haskell and front-end background. We value developers who are flexible about working with different stack configurations, feel confident about tackling new challenges, and aim toward excellence.\n\nOn this project, you will be working on the back-end using artificial intelligence and top-notch technologies in a fully remote environment.\n\n## REQUIREMENTS\n\n**Beyond Haskell, what other abilities should the candidate have?**\n\n* Experience with Type Level Programming applications.\n* Able to develop containerized applications or services, on Docker or Kubernetes ecosystem.\n* Experience with libraries like Servant, Stack, Lens, Free Monads, and Arrows.\n* Deliver high-quality code at a consistent velocity, with test-driven and behavior-driven development practices.\n* Be able to work full-time, in the Eastern or Pacific time zone.\n* Work proactively with other engineers and peers to ensure that the product requirements and dependencies are managed effectively across the broader organization.\n* Possess a strong sense of ownership, urgency, and drive.\n* Be able to create reliable, scalable products that require exceptional technical expertise.\n* Advanced English is required since all internal communications are conducted in this language.\n\n***Nice to have:***\n\n* Development experience with Vue.js.\n* Experience working in Agile environments.\n\nTo assess your code quality, please submit the link of your GitHub page or similar. We will be looking for a clean, well-structured code, as well as automated tests.\n\nIf you are living in Ecuador, please apply through our portal for any in-house full-time employee positions that may be available. This position is not open to agencies or consulting firms.\n\nStack Builders is proud to be an Equal Opportunity Employer. We do not discriminate based on race, religion, color, nationality, gender, sexual orientation, age, disability, or pregnancy.\n\nYou can learn more about us visiting [https://www.stackbuilders.com/ ](https://workable.com/nr?l=https%3A%2F%2Fwww.stackbuilders.com%2F)or take a look at our [blog posts](https://workable.com/nr?l=https%3A%2F%2Fwww.stackbuilders.com%2Fnews%2Fpage%2F1) and [tutorials](https://workable.com/nr?l=https%3A%2F%2Fwww.stackbuilders.com%2Ftutorials%2F) to see some contributions from our team members.\n\n## BENEFITS\n\nSome of the perks of working with us are:\n\n* Strong learning culture.\n* Regular pairing sessions.\n* Challenging projects.\n* Opportunities for company-sponsored conference participation and technical talks.\n* Exceptionally talented and passionate coworkers.", "author_fullname": "t2_3l8600l6", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Job opening: Experienced Haskell Developer (Remote - Full Time)", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_crbh8f", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 37, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 37, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": true, "mod_note": null, "created": 1566013710.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "self.haskell", "allow_live_comments": false, "selftext_html": "<!-- SC_OFF --><div class=\"md\"><p><a href=\"https://stackbuilders.workable.com/j/E01709D897\">https://stackbuilders.workable.com/j/E01709D897</a></p>\n\n<h2>DESCRIPTION</h2>\n\n<p>Stack Builders is an innovative software consultancy based in New York with offices in Quito, Ecuador. We deliver high-quality software and work on interesting projects with a diverse, dynamic and passionate environment. Our organization values intellectual curiosity, strong communication skills, and great programming abilities.</p>\n\n<p>For this position, we are looking for a remote contractor with a very solid Haskell and front-end background. We value developers who are flexible about working with different stack configurations, feel confident about tackling new challenges, and aim toward excellence.</p>\n\n<p>On this project, you will be working on the back-end using artificial intelligence and top-notch technologies in a fully remote environment.</p>\n\n<h2>REQUIREMENTS</h2>\n\n<p><strong>Beyond Haskell, what other abilities should the candidate have?</strong></p>\n\n<ul>\n<li>Experience with Type Level Programming applications.</li>\n<li>Able to develop containerized applications or services, on Docker or Kubernetes ecosystem.</li>\n<li>Experience with libraries like Servant, Stack, Lens, Free Monads, and Arrows.</li>\n<li>Deliver high-quality code at a consistent velocity, with test-driven and behavior-driven development practices.</li>\n<li>Be able to work full-time, in the Eastern or Pacific time zone.</li>\n<li>Work proactively with other engineers and peers to ensure that the product requirements and dependencies are managed effectively across the broader organization.</li>\n<li>Possess a strong sense of ownership, urgency, and drive.</li>\n<li>Be able to create reliable, scalable products that require exceptional technical expertise.</li>\n<li>Advanced English is required since all internal communications are conducted in this language.</li>\n</ul>\n\n<p><strong><em>Nice to have:</em></strong></p>\n\n<ul>\n<li>Development experience with Vue.js.</li>\n<li>Experience working in Agile environments.</li>\n</ul>\n\n<p>To assess your code quality, please submit the link of your GitHub page or similar. We will be looking for a clean, well-structured code, as well as automated tests.</p>\n\n<p>If you are living in Ecuador, please apply through our portal for any in-house full-time employee positions that may be available. This position is not open to agencies or consulting firms.</p>\n\n<p>Stack Builders is proud to be an Equal Opportunity Employer. We do not discriminate based on race, religion, color, nationality, gender, sexual orientation, age, disability, or pregnancy.</p>\n\n<p>You can learn more about us visiting <a href=\"https://workable.com/nr?l=https%3A%2F%2Fwww.stackbuilders.com%2F\">https://www.stackbuilders.com/ </a>or take a look at our <a href=\"https://workable.com/nr?l=https%3A%2F%2Fwww.stackbuilders.com%2Fnews%2Fpage%2F1\">blog posts</a> and <a href=\"https://workable.com/nr?l=https%3A%2F%2Fwww.stackbuilders.com%2Ftutorials%2F\">tutorials</a> to see some contributions from our team members.</p>\n\n<h2>BENEFITS</h2>\n\n<p>Some of the perks of working with us are:</p>\n\n<ul>\n<li>Strong learning culture.</li>\n<li>Regular pairing sessions.</li>\n<li>Challenging projects.</li>\n<li>Opportunities for company-sponsored conference participation and technical talks.</li>\n<li>Exceptionally talented and passionate coworkers.</li>\n</ul>\n</div><!-- SC_ON -->", "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "crbh8f", "is_robot_indexable": true, "report_reasons": null, "author": "LissettePonguillo", "num_crossposts": 0, "num_comments": 4, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/crbh8f/job_opening_experienced_haskell_developer_remote/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://www.reddit.com/r/haskell/comments/crbh8f/job_opening_experienced_haskell_developer_remote/", "subreddit_subscribers": 45076, "created_utc": 1565984910.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "", "author_fullname": "t2_1qnjw60", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Are there any lazy-by-default, dynamically typed functional programming languages?", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_crjg2f", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 3, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 3, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": false, "mod_note": null, "crosspost_parent_list": [{"approved_at_utc": null, "subreddit": "functionalprogramming", "selftext": "", "author_fullname": "t2_1qnjw60", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Are there any lazy-by-default, dynamically typed functional programming languages?", "link_flair_richtext": [], "subreddit_name_prefixed": "r/functionalprogramming", "hidden": false, "pwls": null, "link_flair_css_class": "", "downs": 0, "hide_score": false, "name": "t3_crjclx", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 16, "total_awards_received": 0, "media_embed": {"content": "<blockquote class=\"twitter-video\"><p lang=\"en\" dir=\"ltr\">Anyone know any lazy-by-default, dynamically typed functional programming languages? <a href=\"https://twitter.com/hashtag/functionalprogramming?src=hash&ref_src=twsrc%5Etfw\">#functionalprogramming</a><a href=\"https://twitter.com/planetclojure?ref_src=twsrc%5Etfw\">@planetclojure</a> <a href=\"https://twitter.com/kotlin?ref_src=twsrc%5Etfw\">@kotlin</a> <a href=\"https://twitter.com/fsharporg?ref_src=twsrc%5Etfw\">@fsharporg</a> <a href=\"https://twitter.com/erlang_org?ref_src=twsrc%5Etfw\">@erlang_org</a> <a href=\"https://twitter.com/elixirlang?ref_src=twsrc%5Etfw\">@elixirlang</a> <a href=\"https://twitter.com/scala_lang?ref_src=twsrc%5Etfw\">@scala_lang</a> <a href=\"https://twitter.com/elmlang?ref_src=twsrc%5Etfw\">@elmlang</a> <a href=\"https://twitter.com/OCamlLang?ref_src=twsrc%5Etfw\">@OCamlLang</a> <a href=\"https://twitter.com/racketlang?ref_src=twsrc%5Etfw\">@racketlang</a> <a href=\"https://twitter.com/hashtag/haskell?src=hash&ref_src=twsrc%5Etfw\">#haskell</a> <a href=\"https://twitter.com/hashtag/lisp?src=hash&ref_src=twsrc%5Etfw\">#lisp</a> <a href=\"https://twitter.com/hashtag/schemelang?src=hash&ref_src=twsrc%5Etfw\">#schemelang</a> <a href=\"https://twitter.com/hashtag/fsharp?src=hash&ref_src=twsrc%5Etfw\">#fsharp</a> <a href=\"https://twitter.com/hashtag/clojure?src=hash&ref_src=twsrc%5Etfw\">#clojure</a> <a href=\"https://twitter.com/hashtag/scala?src=hash&ref_src=twsrc%5Etfw\">#scala</a> <a href=\"https://twitter.com/hashtag/elixir?src=hash&ref_src=twsrc%5Etfw\">#elixir</a> <a href=\"https://twitter.com/hashtag/kotlin?src=hash&ref_src=twsrc%5Etfw\">#kotlin</a> <a href=\"https://t.co/mPxvyIG3HH\">pic.twitter.com/mPxvyIG3HH</a></p>— Conor Hoekstra (@code_report) <a href=\"https://twitter.com/code_report/status/1162632825218072577?ref_src=twsrc%5Etfw\">August 17, 2019</a></blockquote>\n<script async src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\n", "width": 350, "scrolling": false, "height": 200}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": {"type": "twitter.com", "oembed": {"provider_url": "https://twitter.com", "version": "1.0", "url": "https://twitter.com/code_report/status/1162632825218072577", "author_name": "Conor Hoekstra", "height": null, "width": 350, "html": "<blockquote class=\"twitter-video\"><p lang=\"en\" dir=\"ltr\">Anyone know any lazy-by-default, dynamically typed functional programming languages? <a href=\"https://twitter.com/hashtag/functionalprogramming?src=hash&ref_src=twsrc%5Etfw\">#functionalprogramming</a><a href=\"https://twitter.com/planetclojure?ref_src=twsrc%5Etfw\">@planetclojure</a> <a href=\"https://twitter.com/kotlin?ref_src=twsrc%5Etfw\">@kotlin</a> <a href=\"https://twitter.com/fsharporg?ref_src=twsrc%5Etfw\">@fsharporg</a> <a href=\"https://twitter.com/erlang_org?ref_src=twsrc%5Etfw\">@erlang_org</a> <a href=\"https://twitter.com/elixirlang?ref_src=twsrc%5Etfw\">@elixirlang</a> <a href=\"https://twitter.com/scala_lang?ref_src=twsrc%5Etfw\">@scala_lang</a> <a href=\"https://twitter.com/elmlang?ref_src=twsrc%5Etfw\">@elmlang</a> <a href=\"https://twitter.com/OCamlLang?ref_src=twsrc%5Etfw\">@OCamlLang</a> <a href=\"https://twitter.com/racketlang?ref_src=twsrc%5Etfw\">@racketlang</a> <a href=\"https://twitter.com/hashtag/haskell?src=hash&ref_src=twsrc%5Etfw\">#haskell</a> <a href=\"https://twitter.com/hashtag/lisp?src=hash&ref_src=twsrc%5Etfw\">#lisp</a> <a href=\"https://twitter.com/hashtag/schemelang?src=hash&ref_src=twsrc%5Etfw\">#schemelang</a> <a href=\"https://twitter.com/hashtag/fsharp?src=hash&ref_src=twsrc%5Etfw\">#fsharp</a> <a href=\"https://twitter.com/hashtag/clojure?src=hash&ref_src=twsrc%5Etfw\">#clojure</a> <a href=\"https://twitter.com/hashtag/scala?src=hash&ref_src=twsrc%5Etfw\">#scala</a> <a href=\"https://twitter.com/hashtag/elixir?src=hash&ref_src=twsrc%5Etfw\">#elixir</a> <a href=\"https://twitter.com/hashtag/kotlin?src=hash&ref_src=twsrc%5Etfw\">#kotlin</a> <a href=\"https://t.co/mPxvyIG3HH\">pic.twitter.com/mPxvyIG3HH</a></p>— Conor Hoekstra (@code_report) <a href=\"https://twitter.com/code_report/status/1162632825218072577?ref_src=twsrc%5Etfw\">August 17, 2019</a></blockquote>\n<script async src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\n", "author_url": "https://twitter.com/code_report", "provider_name": "Twitter", "cache_age": 3153600000, "type": "rich"}}, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {"content": "<blockquote class=\"twitter-video\"><p lang=\"en\" dir=\"ltr\">Anyone know any lazy-by-default, dynamically typed functional programming languages? <a href=\"https://twitter.com/hashtag/functionalprogramming?src=hash&ref_src=twsrc%5Etfw\">#functionalprogramming</a><a href=\"https://twitter.com/planetclojure?ref_src=twsrc%5Etfw\">@planetclojure</a> <a href=\"https://twitter.com/kotlin?ref_src=twsrc%5Etfw\">@kotlin</a> <a href=\"https://twitter.com/fsharporg?ref_src=twsrc%5Etfw\">@fsharporg</a> <a href=\"https://twitter.com/erlang_org?ref_src=twsrc%5Etfw\">@erlang_org</a> <a href=\"https://twitter.com/elixirlang?ref_src=twsrc%5Etfw\">@elixirlang</a> <a href=\"https://twitter.com/scala_lang?ref_src=twsrc%5Etfw\">@scala_lang</a> <a href=\"https://twitter.com/elmlang?ref_src=twsrc%5Etfw\">@elmlang</a> <a href=\"https://twitter.com/OCamlLang?ref_src=twsrc%5Etfw\">@OCamlLang</a> <a href=\"https://twitter.com/racketlang?ref_src=twsrc%5Etfw\">@racketlang</a> <a href=\"https://twitter.com/hashtag/haskell?src=hash&ref_src=twsrc%5Etfw\">#haskell</a> <a href=\"https://twitter.com/hashtag/lisp?src=hash&ref_src=twsrc%5Etfw\">#lisp</a> <a href=\"https://twitter.com/hashtag/schemelang?src=hash&ref_src=twsrc%5Etfw\">#schemelang</a> <a href=\"https://twitter.com/hashtag/fsharp?src=hash&ref_src=twsrc%5Etfw\">#fsharp</a> <a href=\"https://twitter.com/hashtag/clojure?src=hash&ref_src=twsrc%5Etfw\">#clojure</a> <a href=\"https://twitter.com/hashtag/scala?src=hash&ref_src=twsrc%5Etfw\">#scala</a> <a href=\"https://twitter.com/hashtag/elixir?src=hash&ref_src=twsrc%5Etfw\">#elixir</a> <a href=\"https://twitter.com/hashtag/kotlin?src=hash&ref_src=twsrc%5Etfw\">#kotlin</a> <a href=\"https://t.co/mPxvyIG3HH\">pic.twitter.com/mPxvyIG3HH</a></p>— Conor Hoekstra (@code_report) <a href=\"https://twitter.com/code_report/status/1162632825218072577?ref_src=twsrc%5Etfw\">August 17, 2019</a></blockquote>\n<script async src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\n", "width": 350, "scrolling": false, "media_domain_url": "https://www.redditmedia.com/mediaembed/crjclx", "height": 200}, "link_flair_text": "Question", "can_mod_post": false, "score": 16, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": false, "mod_note": null, "created": 1566057500.0, "link_flair_type": "text", "wls": null, "banned_by": null, "author_flair_type": "text", "domain": "twitter.com", "allow_live_comments": true, "selftext_html": null, "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "link_flair_template_id": "452249f6-9d22-11e7-9532-0ecc29c74cae", "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2vcmg", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "crjclx", "is_robot_indexable": true, "report_reasons": null, "author": "arkethos", "num_crossposts": 2, "num_comments": 29, "send_replies": true, "whitelist_status": null, "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/functionalprogramming/comments/crjclx/are_there_any_lazybydefault_dynamically_typed/", "parent_whitelist_status": null, "stickied": false, "url": "https://twitter.com/code_report/status/1162632825218072577", "subreddit_subscribers": 9900, "created_utc": 1566028700.0, "discussion_type": null, "media": {"type": "twitter.com", "oembed": {"provider_url": "https://twitter.com", "version": "1.0", "url": "https://twitter.com/code_report/status/1162632825218072577", "author_name": "Conor Hoekstra", "height": null, "width": 350, "html": "<blockquote class=\"twitter-video\"><p lang=\"en\" dir=\"ltr\">Anyone know any lazy-by-default, dynamically typed functional programming languages? <a href=\"https://twitter.com/hashtag/functionalprogramming?src=hash&ref_src=twsrc%5Etfw\">#functionalprogramming</a><a href=\"https://twitter.com/planetclojure?ref_src=twsrc%5Etfw\">@planetclojure</a> <a href=\"https://twitter.com/kotlin?ref_src=twsrc%5Etfw\">@kotlin</a> <a href=\"https://twitter.com/fsharporg?ref_src=twsrc%5Etfw\">@fsharporg</a> <a href=\"https://twitter.com/erlang_org?ref_src=twsrc%5Etfw\">@erlang_org</a> <a href=\"https://twitter.com/elixirlang?ref_src=twsrc%5Etfw\">@elixirlang</a> <a href=\"https://twitter.com/scala_lang?ref_src=twsrc%5Etfw\">@scala_lang</a> <a href=\"https://twitter.com/elmlang?ref_src=twsrc%5Etfw\">@elmlang</a> <a href=\"https://twitter.com/OCamlLang?ref_src=twsrc%5Etfw\">@OCamlLang</a> <a href=\"https://twitter.com/racketlang?ref_src=twsrc%5Etfw\">@racketlang</a> <a href=\"https://twitter.com/hashtag/haskell?src=hash&ref_src=twsrc%5Etfw\">#haskell</a> <a href=\"https://twitter.com/hashtag/lisp?src=hash&ref_src=twsrc%5Etfw\">#lisp</a> <a href=\"https://twitter.com/hashtag/schemelang?src=hash&ref_src=twsrc%5Etfw\">#schemelang</a> <a href=\"https://twitter.com/hashtag/fsharp?src=hash&ref_src=twsrc%5Etfw\">#fsharp</a> <a href=\"https://twitter.com/hashtag/clojure?src=hash&ref_src=twsrc%5Etfw\">#clojure</a> <a href=\"https://twitter.com/hashtag/scala?src=hash&ref_src=twsrc%5Etfw\">#scala</a> <a href=\"https://twitter.com/hashtag/elixir?src=hash&ref_src=twsrc%5Etfw\">#elixir</a> <a href=\"https://twitter.com/hashtag/kotlin?src=hash&ref_src=twsrc%5Etfw\">#kotlin</a> <a href=\"https://t.co/mPxvyIG3HH\">pic.twitter.com/mPxvyIG3HH</a></p>— Conor Hoekstra (@code_report) <a href=\"https://twitter.com/code_report/status/1162632825218072577?ref_src=twsrc%5Etfw\">August 17, 2019</a></blockquote>\n<script async src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\n", "author_url": "https://twitter.com/code_report", "provider_name": "Twitter", "cache_age": 3153600000, "type": "rich"}}, "is_video": false}], "created": 1566058220.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "twitter.com", "allow_live_comments": false, "selftext_html": null, "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": true, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "crjg2f", "is_robot_indexable": true, "report_reasons": null, "author": "arkethos", "num_crossposts": 0, "num_comments": 8, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "crosspost_parent": "t3_crjclx", "author_flair_text_color": null, "permalink": "/r/haskell/comments/crjg2f/are_there_any_lazybydefault_dynamically_typed/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://twitter.com/code_report/status/1162632825218072577", "subreddit_subscribers": 45076, "created_utc": 1566029420.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "", "author_fullname": "t2_pae9q", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Evolution of ghc (Glasgow Haskell Compiler) [video]", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_cr4dkm", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 60, "total_awards_received": 0, "media_embed": {"content": "<iframe class=\"embedly-embed\" src=\"https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F8R9pHErMJCY%3Ffeature%3Doembed&url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D8R9pHErMJCY&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F8R9pHErMJCY%2Fhqdefault.jpg&key=2aa3c4d5f3de4f5b9120b660ad850dc9&type=text%2Fhtml&schema=youtube\" width=\"600\" height=\"338\" scrolling=\"no\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen=\"true\"></iframe>", "width": 600, "scrolling": false, "height": 338}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": {"type": "youtube.com", "oembed": {"provider_url": "https://www.youtube.com/", "description": "Gource visualization of ghc (https://github.com/ghc/ghc) [08-15-2019]. Mirror of the Glasgow Haskell Compiler. Please submit issues and patches to GHC's Gitlab instance (https://gitlab.haskell.org/ghc/ghc). First time contributors are encouraged to get started with the newcomers info (https://gitlab.haskell.org/ghc/ghc/wikis/contributing).", "title": "Evolution of ghc (Glasgow Haskell Compiler)", "url": "http://www.youtube.com/watch?v=8R9pHErMJCY", "type": "video", "author_name": "Landon Wilkins", "height": 338, "width": 600, "html": "<iframe class=\"embedly-embed\" src=\"https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F8R9pHErMJCY%3Ffeature%3Doembed&url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D8R9pHErMJCY&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F8R9pHErMJCY%2Fhqdefault.jpg&key=2aa3c4d5f3de4f5b9120b660ad850dc9&type=text%2Fhtml&schema=youtube\" width=\"600\" height=\"338\" scrolling=\"no\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen=\"true\"></iframe>", "thumbnail_width": 480, "version": "1.0", "provider_name": "YouTube", "thumbnail_url": "https://i.ytimg.com/vi/8R9pHErMJCY/hqdefault.jpg", "thumbnail_height": 360, "author_url": "https://www.youtube.com/user/Silvoir8"}}, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {"content": "<iframe class=\"embedly-embed\" src=\"https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F8R9pHErMJCY%3Ffeature%3Doembed&url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D8R9pHErMJCY&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F8R9pHErMJCY%2Fhqdefault.jpg&key=2aa3c4d5f3de4f5b9120b660ad850dc9&type=text%2Fhtml&schema=youtube\" width=\"600\" height=\"338\" scrolling=\"no\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen=\"true\"></iframe>", "width": 600, "scrolling": false, "media_domain_url": "https://www.redditmedia.com/mediaembed/cr4dkm", "height": 338}, "link_flair_text": null, "can_mod_post": false, "score": 60, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": false, "mod_note": null, "created": 1565979233.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "youtube.com", "allow_live_comments": false, "selftext_html": null, "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "cr4dkm", "is_robot_indexable": true, "report_reasons": null, "author": "pretty_colors", "num_crossposts": 0, "num_comments": 13, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/cr4dkm/evolution_of_ghc_glasgow_haskell_compiler_video/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://www.youtube.com/attribution_link?a=woZOUlXO6KE&u=%2Fwatch%3Fv%3D8R9pHErMJCY%26feature%3Dshare", "subreddit_subscribers": 45076, "created_utc": 1565950433.0, "discussion_type": null, "media": {"type": "youtube.com", "oembed": {"provider_url": "https://www.youtube.com/", "description": "Gource visualization of ghc (https://github.com/ghc/ghc) [08-15-2019]. Mirror of the Glasgow Haskell Compiler. Please submit issues and patches to GHC's Gitlab instance (https://gitlab.haskell.org/ghc/ghc). First time contributors are encouraged to get started with the newcomers info (https://gitlab.haskell.org/ghc/ghc/wikis/contributing).", "title": "Evolution of ghc (Glasgow Haskell Compiler)", "url": "http://www.youtube.com/watch?v=8R9pHErMJCY", "type": "video", "author_name": "Landon Wilkins", "height": 338, "width": 600, "html": "<iframe class=\"embedly-embed\" src=\"https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F8R9pHErMJCY%3Ffeature%3Doembed&url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D8R9pHErMJCY&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F8R9pHErMJCY%2Fhqdefault.jpg&key=2aa3c4d5f3de4f5b9120b660ad850dc9&type=text%2Fhtml&schema=youtube\" width=\"600\" height=\"338\" scrolling=\"no\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen=\"true\"></iframe>", "thumbnail_width": 480, "version": "1.0", "provider_name": "YouTube", "thumbnail_url": "https://i.ytimg.com/vi/8R9pHErMJCY/hqdefault.jpg", "thumbnail_height": 360, "author_url": "https://www.youtube.com/user/Silvoir8"}}, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "If yes, then how exactly? The tutorials are all focused on uaing Haskell for the entire stack, and how to call JS from Haskell, not the other way around", "author_fullname": "t2_hitpr", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Is it possible to use ghcjs to compile Hakell library to a Javascript library, to be imported into and called from Javascript?", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_cr7mfc", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 19, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 19, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": true, "mod_note": null, "created": 1565996778.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "self.haskell", "allow_live_comments": false, "selftext_html": "<!-- SC_OFF --><div class=\"md\"><p>If yes, then how exactly? The tutorials are all focused on uaing Haskell for the entire stack, and how to call JS from Haskell, not the other way around</p>\n</div><!-- SC_ON -->", "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "cr7mfc", "is_robot_indexable": true, "report_reasons": null, "author": "thetimujin", "num_crossposts": 0, "num_comments": 5, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/cr7mfc/is_it_possible_to_use_ghcjs_to_compile_hakell/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://www.reddit.com/r/haskell/comments/cr7mfc/is_it_possible_to_use_ghcjs_to_compile_hakell/", "subreddit_subscribers": 45076, "created_utc": 1565967978.0, "discussion_type": null, "media": null, "is_video": false}}, {"kind": "t3", "data": {"approved_at_utc": null, "subreddit": "haskell", "selftext": "", "author_fullname": "t2_kws52", "saved": false, "mod_reason_title": null, "gilded": 0, "clicked": false, "title": "Dependent types: A pessimist debates an optimist on Hacker News", "link_flair_richtext": [], "subreddit_name_prefixed": "r/haskell", "hidden": false, "pwls": 6, "link_flair_css_class": null, "downs": 0, "hide_score": false, "name": "t3_cr80iz", "quarantine": false, "link_flair_text_color": "dark", "author_flair_background_color": null, "subreddit_type": "public", "ups": 14, "total_awards_received": 0, "media_embed": {}, "author_flair_template_id": null, "is_original_content": false, "user_reports": [], "secure_media": null, "is_reddit_media_domain": false, "is_meta": false, "category": null, "secure_media_embed": {}, "link_flair_text": null, "can_mod_post": false, "score": 14, "approved_by": null, "thumbnail": "", "edited": false, "author_flair_css_class": null, "author_flair_richtext": [], "gildings": {}, "content_categories": null, "is_self": false, "mod_note": null, "created": 1565998446.0, "link_flair_type": "text", "wls": 6, "banned_by": null, "author_flair_type": "text", "domain": "news.ycombinator.com", "allow_live_comments": false, "selftext_html": null, "likes": null, "suggested_sort": null, "banned_at_utc": null, "view_count": null, "archived": false, "no_follow": false, "is_crosspostable": false, "pinned": false, "over_18": false, "all_awardings": [], "media_only": false, "can_gild": false, "spoiler": false, "locked": false, "author_flair_text": null, "visited": false, "num_reports": null, "distinguished": null, "subreddit_id": "t5_2qh36", "mod_reason_by": null, "removal_reason": null, "link_flair_background_color": "", "id": "cr80iz", "is_robot_indexable": true, "report_reasons": null, "author": "JeffreyBenjaminBrown", "num_crossposts": 0, "num_comments": 18, "send_replies": true, "whitelist_status": "all_ads", "contest_mode": false, "mod_reports": [], "author_patreon_flair": false, "author_flair_text_color": null, "permalink": "/r/haskell/comments/cr80iz/dependent_types_a_pessimist_debates_an_optimist/", "parent_whitelist_status": "all_ads", "stickied": false, "url": "https://news.ycombinator.com/item?id=20714137", "subreddit_subscribers": 45076, "created_utc": 1565969646.0, "discussion_type": null, "media": null, "is_video": false}}], "after": "t3_cr80iz", "before": null}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment