gopher://gopher.someodd.zip:70/1/catalog/tech/programming/ProgrammingDeveloper tooling, code and compiler workflows, and formal verification.2026-04-28T00:00:00Zgopher.someodd.zipgopher://gopher.someodd.zip:70/0/tech/programming/Verifying using Haskell in the Age of AI.mdVerifying using Haskell in the Age of AI.md2026-04-28T00:00:00Z2026-04-28T00:00:00ZVerifying using Haskell in the Age of AIgopher://gopher.someodd.zip:70/0/tech/programming/formal-verification-and-property-testing-of-an-algorithm.txtFormal verification and property testing of a custom algorithm2024-11-29T00:00:00Z2024-11-29T00:00:00ZHow to confirm code does what it claims: introduces formal verifica...1,000 test "cases" from just one actual property test.
And this is because, I think, you're dealing with more abstract logic, which Haskell really lends itself to.
## more on the alonzo-church split
]]>gopher://gopher.someodd.zip:70/0/tech/programming/git-multi-user.txtgit, GitHub and multiple accounts/profiles2024-11-28T00:00:00Z2024-11-28T00:00:00ZConfigures git and SSH to cleanly separate multiple GitHub accounts... username_public_key.asc
gpg --armor --export-secret-keys somekeyhere > username_private_key.asc
```
Moving on, add the GPG key to GitHub (should be similar in the GitHub interface
to adding a new SSH key):
```
gpg --armor --export somekeyhere
```
For these remaining configurations, I think there's a better way to do this,
but configure `git` to use the GPG key for a specific repo:
```
git config user.signingkey somekeyhere
git config commit.gpgsign true
```
Also, config `git` to use a specific username and email for this repo:
```
git config user.name "full name"
git config user.email "you@example.org"
```
You can make signed commits like this:
```
git commit -S -m "Test signed commit"
```
## Git configuration per domain
This is a more maintainable approach to have defaults set per domain we have
(matching our `~/.ssh/config` domains, used in repos):
Create a `~/.gitconfig-username`:
```
[user]
name = Full Name
email = user@example.org
signingkey = somekeyhere
[commit]
gpgsign = true
```
Update global git configuration (`~/.gitconfig`):
```
[includeIf "hasconfig:remote.*.url:git@github.com-username:*/**"]
path = ~/.gitconfig-username
```
Check the applied settings in a repo that uses the domain `github.com-username`:
```
git config --get user.name
git config --get user.email
git config --get user.signingkey
git config --get commit.gpgsign
```
]]>gopher://gopher.someodd.zip:70/0/tech/programming/haskell-compiling-windows.hsHaskell Compiling Windows (On Linux)2024-10-14T00:00:00Z2024-10-14T00:00:00ZHow to cross-compile Haskell binaries for Windows from Linux. Writt...gopher://gopher.someodd.zip:70/0/tech/programming/liquidhaskell-verification-stack.txtSetup Haskell verification with LiquidHaskell and Stack2024-10-14T00:00:00Z2024-10-14T00:00:00ZGetting started with LiquidHaskell and Stack for refinement-type ve...gopher://gopher.someodd.zip:70/0/tech/programming/haskell-nix.txtNix Flake a Haskell Project2024-03-12T00:00:00Z2024-03-12T00:00:00ZNotes on getting a Nix flake working for a Haskell project to reduc...=4.7 && <5,
```
And Here's a list where you can tell which version of GHC you may want to use based off your `base` constraints: https://wiki.haskell.org/Base_package
This tells me it can use anything from 7.8.1 to (as of now) 9.8.1. Based off of deduction of APIs I kenw I had to set the versions of a few dependencies in my cabal file, basically, too. However, one of the dependencies (`errata`) I had to pin wanted something between `4.12` (GHC 8.6.1) and `4.17` (GHC 9.4.1). I changed my `base` constraints around this in the hopes it'd make things easier.
Things to pay attention to in the `flake.nix` generated:
* Is the cache being used?
* `nixpkgs.url`: this may come in handy: https://lazamar.co.uk/nix-versions/
* `basePackages`
I also found out a package I was using is broken in nixpkgs right now, so I just added it myself and removed it from dependencies (a library to convert a number to a roman numeral).
Another issue I encountered was I needed a specific version of errata, basically, based off the API.
I also searched nixpkgs to see which version holds errata 0.3.0.0 so I could set `nixpkgs.url` basically, luckily the flake made this easy:
```
packages = {
errata.source = "0.3.0.0"; # Hackage version override
# shower.source = inputs.shower;
};
```
after searching for the right errata version in https://lazamar.co.uk/nix-versions/ -- I found it in nixos-22.11. After doing so I think it was clear that I should use something older and more stable than the nixpkgs `unstable`, so I did this:
```
nixpkgs.url = "github:nixos/nixpkgs/nixos-22.11";
```
Even so I still have this left over:
```
hspec-golden >=0.1 && <0.2
```
Which I found strange because of these results: https://lazamar.co.uk/nix-versions/?channel=nixos-22.11&package=hspec-golden
So i just made sure to set to the latest version that comes before 0.2:
```
packages = {
errata.source = "0.3.0.0"; # Hackage version overrid]]>