<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Kazuki Okamoto</title>
    <description>The latest articles on Forem by Kazuki Okamoto (@kakkun61).</description>
    <link>https://forem.com/kakkun61</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F461867%2F01129efb-365b-434c-b341-65dd5b24126a.jpg</url>
      <title>Forem: Kazuki Okamoto</title>
      <link>https://forem.com/kakkun61</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kakkun61"/>
    <language>en</language>
    <item>
      <title>Envar — Centrally manage environment variables to switch per directory</title>
      <dc:creator>Kazuki Okamoto</dc:creator>
      <pubDate>Tue, 04 Nov 2025 05:35:43 +0000</pubDate>
      <link>https://forem.com/kakkun61/envar-centrally-manage-environment-variables-to-switch-per-directory-4d2n</link>
      <guid>https://forem.com/kakkun61/envar-centrally-manage-environment-variables-to-switch-per-directory-4d2n</guid>
      <description>&lt;p&gt;I've created a command-line tool called Envar.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kakkun61" rel="noopener noreferrer"&gt;
        kakkun61
      &lt;/a&gt; / &lt;a href="https://github.com/kakkun61/envar" rel="noopener noreferrer"&gt;
        envar
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      This is a command-line tool that automatically switches values of environment variables based on the current directory path.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;envar&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;This is a command-line tool that automatically switches values of environment variables based on the current directory path.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Place the &lt;code&gt;envar&lt;/code&gt; binary&lt;/li&gt;
&lt;li&gt;Install the shell hook&lt;/li&gt;
&lt;li&gt;Write the configuration file&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Place the &lt;code&gt;envar&lt;/code&gt; binary&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Run &lt;code&gt;go build&lt;/code&gt; and place the binary file in your &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install the shell hook&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Add this line to your &lt;em&gt;.bashrc&lt;/em&gt;:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;eval&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;$(&lt;/span&gt;envar hook&lt;span class="pl-pds"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;and add this line to your &lt;em&gt;.bash_logout&lt;/em&gt;:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;envar hook &lt;span class="pl-c1"&gt;logout&lt;/span&gt; &lt;span class="pl-smi"&gt;$$&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Write the configuration file&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;The configuration file uses YAML. It is located at &lt;em&gt;&lt;code&gt;$CONFIG_DIR&lt;/code&gt;/envar/&lt;strong&gt;vars.yaml&lt;/strong&gt;&lt;/em&gt; and &lt;em&gt;&lt;code&gt;$CONFIG_DIR&lt;/code&gt;/envar/&lt;strong&gt;execs.yaml&lt;/strong&gt;&lt;/em&gt;. &lt;code&gt;$CONFIG_DIR&lt;/code&gt; is the value returned by &lt;a href="https://pkg.go.dev/os#UserConfigDir" rel="nofollow noopener noreferrer"&gt;&lt;code&gt;os.UserConfigDir()&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;vars.yaml&lt;/strong&gt;&lt;/em&gt; is used to define environment variable values. For example:&lt;/p&gt;
&lt;div class="highlight highlight-source-yaml notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-ent"&gt;FOO_VAR&lt;/span&gt;:
  &lt;span class="pl-ent"&gt;path/to/dir&lt;/span&gt;: &lt;span class="pl-s"&gt;foo-value-1&lt;/span&gt;
  &lt;span class="pl-ent"&gt;other/path&lt;/span&gt;: &lt;span class="pl-s"&gt;foo-value-2&lt;/span&gt;
  &lt;span class="pl-ent"&gt;other/path/never&lt;/span&gt;: &lt;span class="pl-s"&gt;foo-value-3&lt;/span&gt;
  &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; This is a comment line&lt;/span&gt;
  &lt;span class="pl-ent"&gt;~/projects&lt;/span&gt;: &lt;span class="pl-s"&gt;foo-value-4&lt;/span&gt;
  &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-ent"&gt;spacial dir/path&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;: &lt;span class="pl-s"&gt;foo-value-5&lt;/span&gt;
&lt;span class="pl-ent"&gt;BAR_VAR&lt;/span&gt;:
  &lt;span class="pl-ent"&gt;another/dir&lt;/span&gt;: &lt;span class="pl-s"&gt;bar-value-1&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The directory &lt;em&gt;path/to/dir&lt;/em&gt;…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kakkun61/envar" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;This is a tool that allows switching environment variable values on a per-directory basis.&lt;/p&gt;

&lt;p&gt;For example, you can configure an environment variable named &lt;code&gt;FOO&lt;/code&gt; to return the value &lt;code&gt;hoge&lt;/code&gt; when in the directory &lt;em&gt;path/to/A&lt;/em&gt;, and &lt;code&gt;fuga&lt;/code&gt; when in the directory &lt;em&gt;path/to/B&lt;/em&gt;. This configuration is specified in a &lt;em&gt;vars.yaml&lt;/em&gt; file like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;FOO&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;path/to/A&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hoge&lt;/span&gt;
  &lt;span class="na"&gt;path/to/B&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fuga&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also configure environment variables to derive their values from the output of other commands.&lt;/p&gt;

&lt;p&gt;This example is excerpted from my own configuration files and demonstrates switching between personal and work accounts when using the gh command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# vars.yaml&lt;/span&gt;
&lt;span class="na"&gt;GH_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;/home/kazuki/Projects/Work&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;gh&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kakkun61_work&lt;/span&gt;
  &lt;span class="na"&gt;/home/kazuki/Projects&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;gh&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kakkun61&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# execs.yaml&lt;/span&gt;
&lt;span class="na"&gt;gh&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gh auth token --user %s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Frequently Asked Questions Maybe
&lt;/h2&gt;

&lt;p&gt;What's the difference between this and direnv?&lt;/p&gt;

&lt;p&gt;Direnv works by writing configuration files containing environment variables you want to set in that directory, primarily for environment variables needed by all users of a project. These are project-specific environment variables.&lt;/p&gt;

&lt;p&gt;In contrast, envar stores configuration files in the user-specific settings directory (e.g., &lt;em&gt;~/.config/envar&lt;/em&gt;). It's designed for setting environment variables that serve personal needs, such as account switching in the above example.&lt;/p&gt;

&lt;p&gt;Which shell versions are supported?&lt;/p&gt;

&lt;p&gt;Currently, only bash is supported. If there's demand, I may add support for zsh as well.&lt;/p&gt;




&lt;p&gt;Mainly translated by &lt;a href="https://translate.preferredai.jp/" rel="noopener noreferrer"&gt;Plamo Translation&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>go</category>
      <category>cli</category>
    </item>
    <item>
      <title>wd command</title>
      <dc:creator>Kazuki Okamoto</dc:creator>
      <pubDate>Tue, 18 Oct 2022 18:12:45 +0000</pubDate>
      <link>https://forem.com/kakkun61/wd-command-4b2g</link>
      <guid>https://forem.com/kakkun61/wd-command-4b2g</guid>
      <description>&lt;p&gt;I have just released wd command!&lt;/p&gt;

&lt;h1&gt;
  
  
  What's wd command?
&lt;/h1&gt;

&lt;p&gt;A following command runs a &lt;code&gt;COMMAND&lt;/code&gt; with some &lt;code&gt;OPTIONS&lt;/code&gt; on a &lt;code&gt;DIRECTORY&lt;/code&gt; as a working directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ wd DIRECTORY COMMAND OPTIONS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pushd&lt;/code&gt; and &lt;code&gt;popd&lt;/code&gt; are too long to type for me.&lt;/p&gt;

&lt;h1&gt;
  
  
  Install
&lt;/h1&gt;

&lt;p&gt;Binaries are provided at a GitHub Release page. They are for Windows, Linux, and macOS (x64)&lt;sup id="fnref1"&gt;1&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kakkun61/wd/releases/tag/0.1.0.0" rel="noopener noreferrer"&gt;https://github.com/kakkun61/wd/releases/tag/0.1.0.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to build it, you need &lt;code&gt;cabal&lt;/code&gt; and &lt;code&gt;ghc&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ make install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You like it? Give a star on the GitHub repo.&lt;/p&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;I'm going to add a binary for macOS (ARM) when GitHub Actions will provide a macOS (ARM) platform. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>haskell</category>
    </item>
    <item>
      <title>Path Environment Variable Quick Switcher for PowerShell</title>
      <dc:creator>Kazuki Okamoto</dc:creator>
      <pubDate>Mon, 23 Aug 2021 11:17:21 +0000</pubDate>
      <link>https://forem.com/kakkun61/path-environment-variable-quick-switcher-for-powershell-265c</link>
      <guid>https://forem.com/kakkun61/path-environment-variable-quick-switcher-for-powershell-265c</guid>
      <description>&lt;p&gt;You may want to turn on and off the &lt;code&gt;PATH&lt;/code&gt; environment variable, for example, when you use UNIX tools with MSYS2.&lt;/p&gt;

&lt;p&gt;It's annoying like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="err"&gt;»&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$prevPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;Path&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;»&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;MSYS2&lt;/span&gt;&lt;span class="s2"&gt;\bin;&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;MSYS2&lt;/span&gt;&lt;span class="s2"&gt;\mingw64\bin;&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;Path&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;»&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# do some work with MSYS2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;»&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$prevPath&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Or you may want to change each version of compilers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;powershell-path-switcher&lt;/strong&gt; supports this.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kakkun61" rel="noopener noreferrer"&gt;
        kakkun61
      &lt;/a&gt; / &lt;a href="https://github.com/kakkun61/powershell-path-switcher" rel="noopener noreferrer"&gt;
        powershell-path-switcher
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Path Environment Variable Quick Switcher
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;powershell-path-switcher&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/kakkun61/powershell-path-switcher/actions?query=workflow%3Ainstall" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/kakkun61/powershell-path-switcher/workflows/install/badge.svg" alt="GitHub Actions: install"&gt;&lt;/a&gt; &lt;a href="https://github.com/kakkun61/powershell-path-switcher/actions?query=workflow%3Alint" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/kakkun61/powershell-path-switcher/workflows/lint/badge.svg" alt="GitHub Actions: lint"&gt;&lt;/a&gt; &lt;a href="https://www.powershellgallery.com/packages/path-switcher/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d7fc205f003cfd3ba17f22ecc09cb6b125f8e7a88783f2386c0d2bc653e71e78/68747470733a2f2f696d672e736869656c64732e696f2f706f7765727368656c6c67616c6c6572792f702f706174682d73776974636865722e737667" alt="PowerShell Gallery"&gt;&lt;/a&gt; &lt;a href="https://github.com/sponsors/kakkun61" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/56b95c184cadddd2adb0b3f8987dc2cf0cd2fe82b24e5284f147d93a67543490/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53706f6e736f722d2545322539442541342d7265643f6c6f676f3d476974487562" alt="Sponsor"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Path Environment Variable Quick Switcher.&lt;/p&gt;


  
    

    &lt;span class="m-1"&gt;JFyT6Gn0gm2n2m60.mp4&lt;/span&gt;
  

  

  


&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Invoke the following commands to install this.&lt;/p&gt;

&lt;div class="highlight highlight-source-powershell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;&amp;gt;&lt;/span&gt; &lt;span class="pl-c1"&gt;Install-Module&lt;/span&gt; path&lt;span class="pl-k"&gt;-&lt;/span&gt;switcher
&lt;span class="pl-k"&gt;&amp;gt;&lt;/span&gt; &lt;span class="pl-c1"&gt;Import-Module&lt;/span&gt; path&lt;span class="pl-k"&gt;-&lt;/span&gt;switcher&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;HEAD&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;If you want to use HEAD, follow this instruction.&lt;/p&gt;

&lt;div class="highlight highlight-source-powershell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;&amp;gt;&lt;/span&gt; git clone git&lt;span class="pl-smi"&gt;@github&lt;span class="pl-smi"&gt;.com&lt;/span&gt;&lt;/span&gt;:kakkun61&lt;span class="pl-k"&gt;/&lt;/span&gt;powershell&lt;span class="pl-k"&gt;-&lt;/span&gt;path&lt;span class="pl-k"&gt;-&lt;/span&gt;switcher.git
&lt;span class="pl-k"&gt;&amp;gt;&lt;/span&gt; &lt;span class="pl-c1"&gt;Import-Module&lt;/span&gt; .\powershell&lt;span class="pl-k"&gt;-&lt;/span&gt;path&lt;span class="pl-k"&gt;-&lt;/span&gt;switcher\path&lt;span class="pl-k"&gt;-&lt;/span&gt;switcher.psd1 &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; -Force option may be necessary&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Configuration&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;This module treats three types of configurations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;local configuration&lt;/li&gt;
&lt;li&gt;user global configuration&lt;/li&gt;
&lt;li&gt;system global configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Local configuration&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;A local configuration is named &lt;em&gt;powershell-path-switcher.yaml&lt;/em&gt; and located at the current working directory or its parents recursively.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;User global configuration&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;A user global configuration is named &lt;em&gt;config.yaml&lt;/em&gt; and located at &lt;em&gt;&lt;code&gt;$Env:APPDATA\powershell-path-switcher&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;System global configuration&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;A system global configuration is named &lt;em&gt;config.yaml&lt;/em&gt; and located at &lt;em&gt;&lt;code&gt;$Env:ProgramData\powershell-path-switcher&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Overwriting&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;When the configurations have the same keys, upper ones overwrite.&lt;/p&gt;

&lt;p&gt;For example there are following configurations:&lt;/p&gt;

&lt;div class="highlight highlight-source-yaml notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; local configuration&lt;/span&gt;
&lt;span class="pl-ent"&gt;foo&lt;/span&gt;: &lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kakkun61/powershell-path-switcher" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.powershellgallery.com/packages/path-switcher/" rel="noopener noreferrer"&gt;PowerShell Gallery&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Interactive select
&lt;/h2&gt;

&lt;p&gt;A quick view is at &lt;a href="https://user-images.githubusercontent.com/282593/130179275-62a876d7-4e93-488a-93b8-7688535251d6.mp4" rel="noopener noreferrer"&gt;this video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Prepare a configuration file,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# $Env:ProgramData\powershell-path-switcher\config.yaml&lt;/span&gt;
&lt;span class="na"&gt;msys2-usr&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;     &lt;span class="s"&gt;C:\tools\msys64\usr\bin&lt;/span&gt;
&lt;span class="na"&gt;msys2-mingw64&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;C:\tools\msys64\mingw64\bin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and invoke &lt;code&gt;Switch-Path&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;» Switch-Path
&amp;gt; [ ] msys2-usr: C:\tools\msys64\usr\bin
  [ ] msys2-mingw64: C:\tools\msys64\mingw64\bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can move its cursor (&lt;code&gt;&amp;gt;&lt;/code&gt;) up/down with ↑/↓ keys, select (check by &lt;code&gt;x&lt;/code&gt;) with the space key and reflect with the enter key.&lt;/p&gt;

&lt;p&gt;When you want to remove a specified path from the &lt;code&gt;PATH&lt;/code&gt; variable, you can delete it by removing its check mark (&lt;code&gt;x&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;For more information see a &lt;a href="https://github.com/kakkun61/powershell-path-switcher#readme" rel="noopener noreferrer"&gt;README&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>powershell</category>
    </item>
    <item>
      <title>Ephemeral Purely Functional Data Structure and Linear Type: Again</title>
      <dc:creator>Kazuki Okamoto</dc:creator>
      <pubDate>Fri, 01 Jan 2021 09:52:10 +0000</pubDate>
      <link>https://forem.com/kakkun61/ephemeral-purely-functional-data-structure-and-linear-type-again-4mnm</link>
      <guid>https://forem.com/kakkun61/ephemeral-purely-functional-data-structure-and-linear-type-again-4mnm</guid>
      <description>&lt;p&gt;The Japanese version is at &lt;a href="https://kakkun61.hatenablog.com/entry/2021/01/01/%E7%B6%9A%E3%83%BB%E5%88%B9%E9%82%A3%E7%9A%84%E7%B4%94%E7%B2%8B%E9%96%A2%E6%95%B0%E7%9A%84%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0%E3%81%A8%E7%B7%9A%E5%BD%A2%E5%9E%8Bl" rel="noopener noreferrer"&gt;はてなブログ&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Additional information for &lt;a href="https://dev.to/kakkun61/ephemeral-purely-functional-data-structure-and-linear-type-489j"&gt;the previous article&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/kakkun61" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F461867%2F01129efb-365b-434c-b341-65dd5b24126a.jpg" alt="kakkun61"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/kakkun61/ephemeral-purely-functional-data-structure-and-linear-type-489j" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Ephemeral Purely Functional Data Structure and Linear Type&lt;/h2&gt;
      &lt;h3&gt;Kazuki Okamoto ・ Dec 28 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#haskell&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;h1&gt;
  
  
  No loopholes using &lt;code&gt;pure&lt;/code&gt;
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Meh, there is a loophole to escape from the constraint with &lt;code&gt;pure&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I wrote it carelessly, I was noticed good information on &lt;a href="https://www.reddit.com/r/haskell/comments/kltjla/ephemeral_purely_functional_data_structure_and/ghhnkgh?context=3" rel="noopener noreferrer"&gt;Reddit&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I think the solution to the problem with &lt;code&gt;empty&lt;/code&gt; might be to use the &lt;a href="https://github.com/tweag/linear-base/blob/7e5504f87c15e2d3a5096b4f3b86d8a618cf6fb0/src/Data/Unrestricted/Linear.hs#L61" rel="noopener noreferrer"&gt;&lt;code&gt;Ur&lt;/code&gt;&lt;/a&gt; (for "unrestricted") datatype from linear-base:&lt;/p&gt;


&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="n"&gt;empty&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Ur&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Ur&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Trying to run &lt;code&gt;empty Ur&lt;/code&gt; shouldn't typecheck, because the &lt;code&gt;Ur&lt;/code&gt; constructor is not linear. This seems to be an idiom used in &lt;a href="https://github.com/tweag/linear-base/blob/7e5504f87c15e2d3a5096b4f3b86d8a618cf6fb0/src/Data/Vector/Mutable/Linear.hs#L114" rel="noopener noreferrer"&gt;other places&lt;/a&gt; of linear-base.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;Queue a&lt;/code&gt; cannot get escaped because of making the type of the return value &lt;code&gt;Ur b&lt;/code&gt;. Passing &lt;code&gt;Queue a&lt;/code&gt; to &lt;code&gt;Ur&lt;/code&gt; is not allowed because the parameter of &lt;code&gt;Ur :: a -&amp;gt; Ur a&lt;/code&gt; may be used many times. How smart!&lt;/p&gt;

&lt;h1&gt;
  
  
  No need for CPS
&lt;/h1&gt;

&lt;p&gt;I found that functions other than generators (&lt;code&gt;empty&lt;/code&gt; in this case) are no need for CPS.&lt;/p&gt;

&lt;p&gt;When applying a linear arrow to a value that is a parameter of another linear arrow, it seems that its return value has linearity too. I must check typing rules about this.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1340894183578431489-237" src="https://platform.twitter.com/embed/Tweet.html?id=1340894183578431489"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1340894183578431489-237');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1340894183578431489&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;In other words, It is not necessary to make &lt;code&gt;enqueue&lt;/code&gt; etc. CPS because their return values must be used once when applying them in a continuation &lt;code&gt;Queue a #-&amp;gt; Ur b&lt;/code&gt; of &lt;code&gt;empty&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="n"&gt;null&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Ur&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;null&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Ur&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;P&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;enqueue&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="n"&gt;enqueue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;dequeue&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Ur&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Maybe&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dequeue&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Ur&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Just&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dequeue&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Ur&lt;/span&gt; &lt;span class="kt"&gt;Nothing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That being so, user codes are as the following. It was easy to write/read if the “let” expression could be used.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;  &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s"&gt;"empty → enqueue → dequeue"&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
    &lt;span class="kr"&gt;let&lt;/span&gt;
      &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Ur&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;
      &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="n"&gt;enqueue&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="kt"&gt;PL&lt;/span&gt;&lt;span class="o"&gt;.&amp;amp;&lt;/span&gt; &lt;span class="nf"&gt;\&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="n"&gt;dequeue&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="kt"&gt;PL&lt;/span&gt;&lt;span class="o"&gt;.&amp;amp;&lt;/span&gt; &lt;span class="nf"&gt;\&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Ur&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Just&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;lseq&lt;/span&gt;&lt;span class="p"&gt;`&lt;/span&gt; &lt;span class="kt"&gt;Ur&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
      &lt;span class="kt"&gt;Ur&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;empty&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;shouldBe&lt;/span&gt;&lt;span class="p"&gt;`&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>haskell</category>
    </item>
    <item>
      <title>Ephemeral Purely Functional Data Structure and Linear Type</title>
      <dc:creator>Kazuki Okamoto</dc:creator>
      <pubDate>Mon, 28 Dec 2020 16:13:39 +0000</pubDate>
      <link>https://forem.com/kakkun61/ephemeral-purely-functional-data-structure-and-linear-type-489j</link>
      <guid>https://forem.com/kakkun61/ephemeral-purely-functional-data-structure-and-linear-type-489j</guid>
      <description>&lt;p&gt;The Japanese version is at &lt;a href="https://kakkun61.hatenablog.com/entry/2020/12/25/%E5%88%B9%E9%82%A3%E7%9A%84%E7%B4%94%E7%B2%8B%E9%96%A2%E6%95%B0%E7%9A%84%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0%E3%81%A8%E7%B7%9A%E5%BD%A2%E5%9E%8B" rel="noopener noreferrer"&gt;はてなブログ&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Chapter 5.2 of “&lt;a href="https://www.cambridge.org/core/books/purely-functional-data-structures/0409255DA1B48FA731859AC72E34D494" rel="noopener noreferrer"&gt;Purely Functional Data Structures&lt;/a&gt;” (PFDS) explains an ephemeral purely functional queue.&lt;/p&gt;

&lt;p&gt;This queue has a constraint that you can operate just once for each value because of its computational complexity. For example, the first following operations are accepted, but the second may take a long time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- a good example&lt;/span&gt;
&lt;span class="n"&gt;ops&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="kr"&gt;let&lt;/span&gt;
    &lt;span class="n"&gt;q0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;empty&lt;/span&gt;
    &lt;span class="n"&gt;q1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;enqueue&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;q0&lt;/span&gt;
    &lt;span class="n"&gt;q2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;enqueue&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;q1&lt;/span&gt;
    &lt;span class="kt"&gt;Just&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dequeue&lt;/span&gt; &lt;span class="n"&gt;q2&lt;/span&gt;
  &lt;span class="kr"&gt;in&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- a bad example&lt;/span&gt;
&lt;span class="n"&gt;ops&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="kr"&gt;let&lt;/span&gt;
    &lt;span class="n"&gt;q0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;empty&lt;/span&gt;
    &lt;span class="n"&gt;q1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;enqueue&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;q0&lt;/span&gt;
    &lt;span class="n"&gt;q2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;enqueue&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;q1&lt;/span&gt;
    &lt;span class="n"&gt;q2'&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;enqueue&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;q1&lt;/span&gt; &lt;span class="c1"&gt;-- q1 is used twice&lt;/span&gt;
    &lt;span class="kt"&gt;Just&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dequeue&lt;/span&gt; &lt;span class="n"&gt;q2&lt;/span&gt;
    &lt;span class="kt"&gt;Just&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dequeue&lt;/span&gt; &lt;span class="n"&gt;q2'&lt;/span&gt;
  &lt;span class="kr"&gt;in&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The theme of this article is that linear types can save this constraint.&lt;/p&gt;
&lt;h1&gt;
  
  
  Used versions
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://mail.haskell.org/pipermail/ghc-devs/2020-September/019286.html" rel="noopener noreferrer"&gt;GHC 9.0.1 alpha 1 (9.0.0.20200925)&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;A linear arrow is &lt;code&gt;(#-&amp;gt;)&lt;/code&gt;, not &lt;code&gt;(%1 -&amp;gt;)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tweag/linear-base/tree/341007891ae77959ac7b147f008e3a1d9c46e96b" rel="noopener noreferrer"&gt;linear-base 341007891ae77959ac7b147f008e3a1d9c46e96b&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  Implementation
&lt;/h1&gt;

&lt;p&gt;I implemented it with the continuation-passing style (CPS) because the GHC adopts linear arrows as linear types. For instance, &lt;code&gt;empty&lt;/code&gt; has the following type.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="n"&gt;empty&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Its continuation has &lt;code&gt;Queue a #-&amp;gt; b&lt;/code&gt; type and so a value of &lt;code&gt;Queue a&lt;/code&gt; type is used only once in this function.&lt;/p&gt;

&lt;p&gt;I implemented others too. Please refer to the PFDS for these computational complexities.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="cp"&gt;{-# LANGUAGE GADTs #-}&lt;/span&gt;
&lt;span class="cp"&gt;{-# LANGUAGE LinearTypes #-}&lt;/span&gt;
&lt;span class="cp"&gt;{-# LANGUAGE Strict #-}&lt;/span&gt;

&lt;span class="kr"&gt;data&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="kr"&gt;where&lt;/span&gt;
  &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
  &lt;span class="kr"&gt;deriving&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Show&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;empty&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="n"&gt;empty&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="kt"&gt;[]&lt;/span&gt; &lt;span class="kt"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;null&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;Bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="n"&gt;null&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;P&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;enqueue&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="n"&gt;enqueue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;dequeue&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Maybe&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="n"&gt;dequeue&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Just&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;dequeue&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="kr"&gt;_&lt;/span&gt; &lt;span class="kr"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="kt"&gt;Nothing&lt;/span&gt;

&lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="kt"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reverse&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The reason for using GADT is to implement functions like &lt;code&gt;null&lt;/code&gt;. If not using GADT, the linearity was required for &lt;code&gt;l&lt;/code&gt; and &lt;code&gt;m&lt;/code&gt; of &lt;code&gt;Queue l m&lt;/code&gt; recursively and so &lt;code&gt;l&lt;/code&gt; cannot be used twice.&lt;/p&gt;

&lt;p&gt;This implementation has one inconvenient stuff, that values of &lt;code&gt;Queue a&lt;/code&gt; type cannot be removed, because linear types request exactly one use. They must get to be return values. Therefore I made &lt;code&gt;Queue a&lt;/code&gt; be an instance of the &lt;code&gt;Consumable&lt;/code&gt; type class of the &lt;code&gt;Prelude.Linear&lt;/code&gt; module of the linear-base package.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="kr"&gt;instance&lt;/span&gt; &lt;span class="kt"&gt;Consumable&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Consumable&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;where&lt;/span&gt;
  &lt;span class="n"&gt;consume&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Queue&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;lseq&lt;/span&gt;&lt;span class="p"&gt;`&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;lseq&lt;/span&gt;&lt;span class="p"&gt;`&lt;/span&gt; &lt;span class="nb"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now I will try to use this.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;Prelude.Linear&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lseq&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;Data.Queue.Ephemeral&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;empty&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;\&lt;/span&gt;&lt;span class="n"&gt;q0&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;enqueue&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;q0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;\&lt;/span&gt;&lt;span class="n"&gt;q1&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dequeue&lt;/span&gt; &lt;span class="n"&gt;q1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;\&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Just&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;q2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;q2&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;lseq&lt;/span&gt;&lt;span class="p"&gt;`&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;… Ah, yeah, It can be used. It can just be used, it cannot be used comfortably.&lt;/p&gt;
&lt;h1&gt;
  
  
  Continuation monad
&lt;/h1&gt;

&lt;p&gt;You can use “do” notation to write/read it easily because CPS functions are monad instances.&lt;/p&gt;

&lt;p&gt;Now can linear CPS functions be linear monad instances? Let me try. … (three days after) They can be! The following type can be a linear monad instance. It was more difficult than I expected to type validly because I was not familiar with linear types.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="kr"&gt;newtype&lt;/span&gt; &lt;span class="kt"&gt;ContT&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ContT&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;runContT&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;#-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;I will try to use it.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kt"&gt;XQualifiedDo&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;Prelude.Linear&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lseq&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="k"&gt;qualified&lt;/span&gt; &lt;span class="nn"&gt;Prelude.Linear&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;PL&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;Data.Queue.Ephemeral&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;Control.Monad.Trans.Cont.Linear&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="k"&gt;qualified&lt;/span&gt; &lt;span class="nn"&gt;Control.Monad.Linear&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ML&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;PL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flip&lt;/span&gt; &lt;span class="n"&gt;runCont&lt;/span&gt; &lt;span class="kt"&gt;PL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="kt"&gt;ML&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kr"&gt;do&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;q0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;cont&lt;/span&gt; &lt;span class="n"&gt;empty&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;q1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;cont&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enqueue&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;q0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="kt"&gt;Just&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;q2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;cont&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dequeue&lt;/span&gt; &lt;span class="n"&gt;q1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;q2&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;&lt;span class="n"&gt;lseq&lt;/span&gt;&lt;span class="p"&gt;`&lt;/span&gt; &lt;span class="kt"&gt;ML&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pure&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Yahoo!&lt;/p&gt;

&lt;p&gt;Meh, there is a loophole to escape from the constraint with &lt;code&gt;pure&lt;/code&gt;.&lt;/p&gt;
&lt;h1&gt;
  
  
  Repository
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/kakkun61/ephemeral-linear-data/tree/fd2f936ffea1a8d98445947dea460234217286b1" rel="noopener noreferrer"&gt;https://github.com/kakkun61/ephemeral-linear-data/tree/fd2f936ffea1a8d98445947dea460234217286b1&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Additional article
&lt;/h1&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/kakkun61" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F461867%2F01129efb-365b-434c-b341-65dd5b24126a.jpg" alt="kakkun61"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/kakkun61/ephemeral-purely-functional-data-structure-and-linear-type-again-4mnm" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Ephemeral Purely Functional Data Structure and Linear Type: Again&lt;/h2&gt;
      &lt;h3&gt;Kazuki Okamoto ・ Jan 1 '21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#haskell&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



</description>
      <category>haskell</category>
    </item>
    <item>
      <title>Static site generator powered by Shake, Lucid, and Hint</title>
      <dc:creator>Kazuki Okamoto</dc:creator>
      <pubDate>Sun, 27 Sep 2020 05:53:04 +0000</pubDate>
      <link>https://forem.com/kakkun61/static-site-generator-powered-by-shake-lucid-and-hint-d5b</link>
      <guid>https://forem.com/kakkun61/static-site-generator-powered-by-shake-lucid-and-hint-d5b</guid>
      <description>&lt;p&gt;The Japanese version is at &lt;a href="https://kakkun61.hatenablog.com/entry/2020/09/26/shake_%2B_lucid_%2B_hint_%E3%81%A7%E9%9D%99%E7%9A%84%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%82%A4%E3%83%88%E7%94%9F%E6%88%90" rel="noopener noreferrer"&gt;はてなブログ&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;I have &lt;a href="https://doujin.kakkun61.com/index.html" rel="noopener noreferrer"&gt;a website for self-published books (Doujin-shi; 同人誌)&lt;/a&gt;, which was generated by &lt;a href="https://jekyllrb.com/" rel="noopener noreferrer"&gt;Jekyll&lt;/a&gt;. I replaced it with a generator powered by &lt;a href="https://shakebuild.com/" rel="noopener noreferrer"&gt;Shake&lt;/a&gt;, &lt;a href="https://hackage.haskell.org/package/lucid" rel="noopener noreferrer"&gt;Lucid&lt;/a&gt;, and &lt;a href="https://hackage.haskell.org/package/hint" rel="noopener noreferrer"&gt;Hint&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The source codes are in &lt;a href="https://github.com/kakkun61/doujin-site" rel="noopener noreferrer"&gt;this repository&lt;/a&gt;. And I made &lt;a href="https://github.com/kakkun61/static-site-generator-template" rel="noopener noreferrer"&gt;a template repository&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why
&lt;/h1&gt;

&lt;p&gt;I chose Jekyll naturally because I chose GitHub Pages as a host. When I followed the rail, Jekyll was useful. However, when I wanted to do out of the rail, Jekyll got to be hard to be used.&lt;/p&gt;

&lt;p&gt;I will explain what the website is before an explanation of what I wanted to do. This website introduces my self-published books and consists of pages of each book and a page of a list of books. Every book has information on sales and exhibitions (Sokubaikai; 即売会) because the books are distributed in ones. And I wanted to show which books are distributed on a sale and exhibition. In other words, I wanted pages of each sale and exhibition and a page of a list of ones. This was difficult with Jekyll (at least with a version of that time).&lt;/p&gt;

&lt;p&gt;I made the site on about January 2018, and soon I intended to change its framework. I tried Hakyll but I didn't like its API design and I didn't change it for a time.&lt;/p&gt;

&lt;p&gt;A day I found Shake, which is used by the GHC project as a build system. I thought it may be useful for my site too. And I found two static website generators using Shake which are &lt;a href="https://hackage.haskell.org/package/rib" rel="noopener noreferrer"&gt;Rib&lt;/a&gt; and &lt;a href="https://hackage.haskell.org/package/slick" rel="noopener noreferrer"&gt;Slick&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I preferred Slick's API and tried to use it. After I removed unnecessary parts of Slick for me, I found no need for Slick and used Shake directly.&lt;/p&gt;

&lt;h1&gt;
  
  
  Project structure
&lt;/h1&gt;

&lt;p&gt;Following is a figure of its project structure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0g9c6xkf9qtimh96b7pa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0g9c6xkf9qtimh96b7pa.png" alt="Project structure" width="800" height="779"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First I didn't want compilations with GHC and links each time contents are changed because they take a long time. And so I decided to embed a Haskell interpreter with a Hint package.&lt;/p&gt;

&lt;p&gt;This is a flow of a generation: writing a rule of a build with Shake, embedding an interpreter with Hint, and building executable gen. By executing gen, reading Haskell source codes of contents and images, etc., converting them, and outputting them as HTML, etc.&lt;/p&gt;

&lt;p&gt;Data.hs is read by both because it is used for generating of gen and by the interpreter executed by gen.&lt;/p&gt;

&lt;p&gt;There are two styles of Shake's rule. One is “backward” style like Make from products to sources, the other is “forward” one from sources to products. This time I used forward style. The forward style needs &lt;a href="https://github.com/jacereda/fsatrace" rel="noopener noreferrer"&gt;Filesystem Access Tracer&lt;/a&gt; (fsatrace).&lt;/p&gt;

&lt;h1&gt;
  
  
  Implementation
&lt;/h1&gt;

&lt;p&gt;A directory structure is like this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;app

&lt;ul&gt;
&lt;li&gt;gen.hs — a generator itself&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;content

&lt;ul&gt;
&lt;li&gt;book/xxx.hs — a page of a book&lt;/li&gt;
&lt;li&gt;image&lt;/li&gt;
&lt;li&gt;lib/Layout.hs — layouts wrapping contents&lt;/li&gt;
&lt;li&gt;style&lt;/li&gt;
&lt;li&gt;xxx.hs — other pages&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;lib

&lt;ul&gt;
&lt;li&gt;Data.hs — data types for both gen.hs and book/xxx.hs&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;doujin-site.cabal&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;A point of gen is about &lt;a href="https://github.com/kakkun61/doujin-site/blob/9d99ffae8a5cd87752e33479e52ffb411b0e8a00/app/gen.hs#L64-L79" rel="noopener noreferrer"&gt;this&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="n"&gt;lucid&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;forall&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Show&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Typeable&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;FilePath&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;FilePath&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Shake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;Action&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;
&lt;span class="n"&gt;lucid&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="n"&gt;destination&lt;/span&gt; &lt;span class="n"&gt;param&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;libs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="kt"&gt;Shake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getDirectoryFiles&lt;/span&gt; &lt;span class="s"&gt;"content/lib"&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"*.hs"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;liftIO&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="kt"&gt;Hint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;runInterpreter&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
    &lt;span class="kt"&gt;Hint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Hint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;languageExtensions&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Hint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;DuplicateRecordFields&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Hint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;OverloadedStrings&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="kt"&gt;Hint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loadModules&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;/&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s"&gt;"content/lib"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;$&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;libs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kt"&gt;Hint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setTopLevelModules&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Main"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="kt"&gt;Hint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setImports&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Data.Functor.Identity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Lucid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Data.Text"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="kt"&gt;Hint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;interpret&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"render ("&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt; &lt;span class="n"&gt;param&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="s"&gt;")"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Hint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="kt"&gt;Lucid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;Html&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kr"&gt;case&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="kr"&gt;of&lt;/span&gt;
    &lt;span class="kt"&gt;Left&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;liftIO&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;hPutStrLn&lt;/span&gt; &lt;span class="n"&gt;stderr&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;displayException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
      &lt;span class="n"&gt;fail&lt;/span&gt; &lt;span class="s"&gt;"interpret"&lt;/span&gt;
    &lt;span class="kt"&gt;Right&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
      &lt;span class="kt"&gt;Shake&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writeFile'&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"out"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;/&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;
      &lt;span class="n"&gt;pure&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;runIdentity&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="kt"&gt;Lucid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evalHtmlT&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I think this is not very difficult. There is one constraint which is that &lt;code&gt;show param&lt;/code&gt; should output a valid Haskell code. When it is derived automatically it must be no problem but manual implementations of &lt;code&gt;show&lt;/code&gt; may not work.&lt;/p&gt;

&lt;p&gt;Haskell source codes of contents must expose &lt;code&gt;render :: Typeable r =&amp;gt; p -&amp;gt; Html r&lt;/code&gt;. book/xxx.hs is like bellow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="cp"&gt;{-# LANGUAGE OverloadedStrings #-}&lt;/span&gt;

&lt;span class="kr"&gt;import&lt;/span&gt;           &lt;span class="nn"&gt;Data&lt;/span&gt;
&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="k"&gt;qualified&lt;/span&gt; &lt;span class="nn"&gt;Layout&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;

&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;Lucid&lt;/span&gt;

&lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
  &lt;span class="kt"&gt;L&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;L&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ogp&lt;/span&gt; &lt;span class="n"&gt;ogp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="kt"&gt;L&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Just&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;pure&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;
  &lt;span class="kr"&gt;where&lt;/span&gt;
    &lt;span class="n"&gt;ogp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;…&lt;/span&gt;
    &lt;span class="n"&gt;book&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;…&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;…&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;Book&lt;/code&gt; return values of each page are gathered and passed to index.hs. index.hs uses it for making a list of books.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="cp"&gt;{-# LANGUAGE DuplicateRecordFields #-}&lt;/span&gt;
&lt;span class="cp"&gt;{-# LANGUAGE NamedFieldPuns        #-}&lt;/span&gt;
&lt;span class="cp"&gt;{-# LANGUAGE OverloadedStrings     #-}&lt;/span&gt;

&lt;span class="kr"&gt;import&lt;/span&gt;           &lt;span class="nn"&gt;Data&lt;/span&gt;
&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="k"&gt;qualified&lt;/span&gt; &lt;span class="nn"&gt;Layout&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;

&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;Data.Foldable&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;
&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;Lucid&lt;/span&gt;

&lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;books&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="kt"&gt;L&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;L&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ogp&lt;/span&gt; &lt;span class="n"&gt;ogp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;div_&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;class_&lt;/span&gt; &lt;span class="s"&gt;"home"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
        &lt;span class="n"&gt;ul_&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;class_&lt;/span&gt; &lt;span class="s"&gt;"book-list"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
          &lt;span class="kt"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;for_&lt;/span&gt; &lt;span class="n"&gt;books&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="nf"&gt;\&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Book&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bookImage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
            &lt;span class="n"&gt;li_&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
              &lt;span class="n"&gt;h3_&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;
                &lt;span class="n"&gt;a_&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;class_&lt;/span&gt; &lt;span class="s"&gt;"post-link"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;href_&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;toHtml&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;
              &lt;span class="n"&gt;div_&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;class_&lt;/span&gt; &lt;span class="s"&gt;"justify-bottom"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
                &lt;span class="n"&gt;ul_&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;class_&lt;/span&gt; &lt;span class="s"&gt;"event-badges"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
                  &lt;span class="kt"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;for_&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="nf"&gt;\&lt;/span&gt;&lt;span class="kt"&gt;Event&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
                    &lt;span class="n"&gt;li_&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;class_&lt;/span&gt; &lt;span class="s"&gt;"event-badge"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;toHtml&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;
                    &lt;span class="s"&gt;" "&lt;/span&gt;
                &lt;span class="n"&gt;a_&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;href_&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;img_&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;src_&lt;/span&gt; &lt;span class="n"&gt;bookImage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alt_&lt;/span&gt; &lt;span class="s"&gt;"book image"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt; &lt;span class="s"&gt;"home-book-front"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="kr"&gt;where&lt;/span&gt;
    &lt;span class="n"&gt;ogp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;…&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I chose Lucid as an HTML notation. A unified syntax is easy because Lucid is an embedded DSL. You can change this part if you want.&lt;/p&gt;

&lt;p&gt;After these preparations, I think it is easy to make pages of sales and exhibitions and a page of a list of them.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Shake as a dependencies resolver&lt;/li&gt;
&lt;li&gt;Hint for embedding an interpreter

&lt;ul&gt;
&lt;li&gt;Compilation of contents is unnecessary&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Lucid as an HTML notation

&lt;ul&gt;
&lt;li&gt;EDSL produces a unified syntax&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;In my opinion, I have noticed again that I prefer combining libraries as parts to making content for frameworks because the former is more flexible.&lt;/p&gt;

</description>
      <category>haskell</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Simplest MonadFail Instance</title>
      <dc:creator>Kazuki Okamoto</dc:creator>
      <pubDate>Wed, 02 Sep 2020 10:28:54 +0000</pubDate>
      <link>https://forem.com/kakkun61/the-simplest-monadfail-instance-2i4e</link>
      <guid>https://forem.com/kakkun61/the-simplest-monadfail-instance-2i4e</guid>
      <description>&lt;p&gt;The Japanese version is at &lt;a href="https://kakkun61.hatenablog.com/entry/2020/09/02/%E4%B8%80%E7%95%AA%E7%B0%A1%E5%8D%98%E3%81%AA_MonadFail_%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9" rel="noopener noreferrer"&gt;はてなブログ&lt;/a&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;After &lt;code&gt;fail&lt;/code&gt; was removed from &lt;code&gt;Monad&lt;/code&gt; a long time ago, I prefer to type computations that may fail to &lt;code&gt;MonadFail&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="n"&gt;foo&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="kt"&gt;MonadFail&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows you to instantiate &lt;code&gt;m&lt;/code&gt; to &lt;code&gt;IO&lt;/code&gt; within the &lt;code&gt;IO&lt;/code&gt; context, and to instantiate it to &lt;code&gt;Maybe&lt;/code&gt; within the pure context for example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- within IO context&lt;/span&gt;
&lt;span class="n"&gt;foo&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="kt"&gt;IO&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;

&lt;span class="c1"&gt;-- within pure context&lt;/span&gt;
&lt;span class="n"&gt;foo&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="kt"&gt;Maybe&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is not happy that &lt;code&gt;Maybe&lt;/code&gt; discards the failure messages. So should we use &lt;code&gt;Either&lt;/code&gt;? &lt;code&gt;Either&lt;/code&gt; is not actually a &lt;code&gt;MonadFail&lt;/code&gt; instance. There was &lt;a href="https://gitlab.haskell.org/ghc/ghc/-/issues/12160" rel="noopener noreferrer"&gt;a proposal about this&lt;/a&gt; which was rejected because of the following reason.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;the instances "get in the way of a user who wants to treat the parameter uniformly"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That being so I wanted the following &lt;code&gt;Result&lt;/code&gt; type as the simplest &lt;code&gt;MonadFail&lt;/code&gt; instance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="kr"&gt;newtype&lt;/span&gt; &lt;span class="kt"&gt;Result&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Result&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Either&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kr"&gt;instance&lt;/span&gt; &lt;span class="kt"&gt;MonadFail&lt;/span&gt; &lt;span class="kt"&gt;Result&lt;/span&gt; &lt;span class="kr"&gt;where&lt;/span&gt;
  &lt;span class="n"&gt;fail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Left&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is actually an equivalent of this but it is deprecated. It is &lt;code&gt;ErrorT&lt;/code&gt; of the mtl package.&lt;/p&gt;

&lt;h1&gt;
  
  
  either-result package
&lt;/h1&gt;

&lt;p&gt;I released &lt;a href="https://hackage.haskell.org/package/either-result" rel="noopener noreferrer"&gt;the either-result package&lt;/a&gt; which contains &lt;code&gt;Result&lt;/code&gt; and some functions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hackage.haskell.org/package/either-result" rel="noopener noreferrer"&gt;https://hackage.haskell.org/package/either-result&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Actually &lt;code&gt;Result&lt;/code&gt; is an alias of &lt;code&gt;ResultT Identity&lt;/code&gt; and &lt;code&gt;ResultT&lt;/code&gt; is a newtype of &lt;code&gt;ExceptT&lt;/code&gt; of the transformers package.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="kt"&gt;Result&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ResultT&lt;/span&gt; &lt;span class="kt"&gt;Identity&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;

&lt;span class="kr"&gt;newtype&lt;/span&gt; &lt;span class="kt"&gt;ResultT&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ResultT&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;ExceptT&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What is the difference between &lt;code&gt;ResultT&lt;/code&gt; and &lt;code&gt;ExceptT&lt;/code&gt; is about &lt;code&gt;MonadFail&lt;/code&gt; instances. On &lt;code&gt;ResultT&lt;/code&gt; &lt;code&gt;fail&lt;/code&gt; wraps a message with &lt;code&gt;Left&lt;/code&gt;, while on &lt;code&gt;ExceptT&lt;/code&gt; it calls &lt;code&gt;fail&lt;/code&gt; of its base monad. Because of it, on &lt;code&gt;ResultT&lt;/code&gt; its base monad is requested to be just &lt;code&gt;Monad&lt;/code&gt;, but on &lt;code&gt;ExceptT&lt;/code&gt; its one is requested to be &lt;code&gt;MonadFail&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="kr"&gt;instance&lt;/span&gt; &lt;span class="kt"&gt;Monad&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;MonadFail&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;ResultT&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;where&lt;/span&gt; &lt;span class="err"&gt;…&lt;/span&gt;

&lt;span class="kr"&gt;instance&lt;/span&gt; &lt;span class="kt"&gt;MonadFail&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;MonadFail&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;ExceptT&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;where&lt;/span&gt; &lt;span class="err"&gt;…&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use &lt;code&gt;throwError&lt;/code&gt; and &lt;code&gt;catchError&lt;/code&gt; because &lt;code&gt;ResultT&lt;/code&gt; is also &lt;code&gt;MonadError&lt;/code&gt; instance of the mtl package.&lt;/p&gt;

&lt;h1&gt;
  
  
  What about the exceptions package?
&lt;/h1&gt;

&lt;p&gt;There is &lt;code&gt;MonadThrow&lt;/code&gt; type class, isn't it? Yes, the exceptions package has &lt;code&gt;MonadThrow&lt;/code&gt; and &lt;code&gt;MonadCatch&lt;/code&gt; type classes. These requests something thrown and caught to be &lt;code&gt;Exception&lt;/code&gt; instances. In my opinion, if you want to recognise thrown and caught things by their type, you should use them. And if you want just messages, use &lt;code&gt;MonadFail&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="kr"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;Monad&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;MonadThrow&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="kr"&gt;where&lt;/span&gt;
  &lt;span class="n"&gt;throwM&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="kt"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;

&lt;span class="kr"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;MonadThrow&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;MonadCatch&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="kr"&gt;where&lt;/span&gt;
  &lt;span class="n"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="kt"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;

&lt;span class="kr"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;Monad&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;MonadFail&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="kr"&gt;where&lt;/span&gt;
  &lt;span class="n"&gt;fail&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;on defining, type computations which may fail to &lt;code&gt;MonadFail m =&amp;gt; m a&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;on using, use it as &lt;code&gt;IO a&lt;/code&gt; within &lt;code&gt;IO&lt;/code&gt; context for example&lt;/li&gt;
&lt;li&gt;on using, use it as &lt;code&gt;Result a&lt;/code&gt; within a pure context&lt;/li&gt;
&lt;li&gt;add star to &lt;a href="https://github.com/kakkun61/either-result" rel="noopener noreferrer"&gt;the GitHub repository&lt;/a&gt; 😉&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>haskell</category>
    </item>
  </channel>
</rss>
