A regular column about programming. Because if/when the machines take over, we should at least speak their language. Haskell. It sounded like a good name for a weapon—a well-sharpened blade, like scimitar or katana. The strong German-sounding plosive in its name, as in Nietzsche or Kafka, added a menacing edge. All I really knew about the language was that it was challenging and intended for math
On April 5th, xkcd released Machine, the 15th annual April Fools project I’ve made with them. It’s a game we’d been dreaming of for years: a giant rube goldberg machine builder in the style of the classic Incredible Machine games, made of a patchwork of machines created by individual xkcd readers. For more details, check out Explain xkcd’s wonderful writeup. This is the story of how we built Machi
はじめに 久しぶりに Haskell を書きたい & 久しぶりに競技プログラミングの問題を解きたいと思い、解こうとしたら久しぶりすぎていろいろ忘れていたので、思い出すついでに記事を書いてみました。 この記事では、Haskell で競技プログラミングの問題を解く際に役立つ、入力を受け取るパターンをいくつか紹介します。(久しぶりすぎて古い書き方かもしれないです。新しい書き方を知っていたらぜひコメント等で教えてください!) Haskellで標準入力を受け取る AtCoder など、競技プログラミングでは標準入力から与えられた入力を処理して、答えを標準出力に出力する、といった形式が多いです。 Haskell における入出力は IO モナドに包まれているので、初心者がきちんと理解したうえで使えるようになるまでに時間がかかります。ですが、競技プログラミングでは入力のパターンはそれほど多くないので、この
April 7, 2024 A eighteen minute read 13 comments 2 🗣️ 11 ❤️ 7 🔁 Tags: programmingparsinginterpreterscompilershaskell Every year I try to solve some problems from the Advent of Code (AoC) competition in a not straightforward way. Let’s solve the part one of the day 19 problem Aplenty by compiling the problem input to an executable file. Every year I try to solve some problems from the Advent of C
Why is Prettier rock solid?I've always wondered why Prettier is so good. Yes, it learnt from gofmt what to do (note that gofmt doesn't indent, which is the hard part). Yes, it was announced in a real life conference, which helped get the initial momentum behind it. All that is fine, but what was a bit inexplicable to me is its quality. You might disagree with the defaults (I like them. The only on
※○:成功, ×:失敗, △:今回の目的に不適 表を見るとわかるとおり、Haskellのライブラリは軒並み動かなかったため、裏道を探すように他の方法を色々試しました。しかし他の方法も中々うまく行かず、最終的には 別言語で作った音声再生コンソールアプリをプロセス間通信でHaskellから呼び出す という 力業 で解決しました。 ということで、まずは成功した方法であるプロセス間通信を使った音声再生を紹介し、そのあとに成功に至らなかった各方法の詳細とつまづきポイントを紹介していきます。 別言語で作った音声再生アプリをプロセス間通信で呼び出す Haskellでの音声再生は難しいですが、言語によっては簡単に音声再生を実現できます。また、Haskellでのプロセス間通信は非常に簡単なので、この組み合わせで音声再生に成功しました。 別言語で音声ファイル再生アプリを作成する まずは別言語で音声ファイル再生
この記事はHaskell Advent Calendar 2022の1日目の記事です。 この記事では、2022年12月時点のHaskellの環境構築手順を紹介します。2023年になっても通用するといいなあ。 対象とする環境 対象とする環境は以下の通りです: Unix系 macOS (Intel / Apple Silicon) Linux (x86_64 / aarch64) WSL2を含む(WSL1は不具合があった気がするので避けてください) Windows (x64) Arm系CPU搭載のコンピューターを使っている場合は、別途LLVMが必要になる場合があります。以下に当てはまる場合は、「補遺:LLVMバックエンドを使う」も読んでください: 64ビットArm(Apple Silicon Macや、Raspberry Pi OSの64ビット版など)で、GHC 9.0またはそれ以前のバージョ
Applicative の値に関数を適用したいとき、liftA2 関数を用いると演算子 <$> を使用するより計算コストを抑えられることがあります。 意味的には liftA2 f x y = f <$> x <*> y です (※定義ではなく、実際の計算方法は異なります) 。 参考「liftA2 - Control.Applicative」 参考「[Haskell] モナド 演算子 まとめ - Qiita」 1. liftA2 関数および liftA3 関数 ここでは説明のため各演算子および関数の型クラス制約を略しますが、型変数 f の型は Functor および Applicative クラスのインスタンスです。 liftA2 関数および liftA3 関数の型は以下のようになっています。 -- Functor (比較用) (<$>) :: (a -> b ) -> f a -> f b
本記事ではモナドを操作する演算子について書きます。 参考「Data.Functor」 参考「Control.Applicative」 参考「Control.Monad」 0. まとめ 用途別: 値に関数を適用する <$>, <&> <*>, <**> =<<, >>= <$!> 関数同士を合成する <=<, >=> 値を破棄して他の値に置き換える <$, $> <*, *> >> 値同士を結合する <|> 型クラス制約別: Functor <$>, <&> <$, $> Applicative <*>, <**> <*, *> Monad =<<, >>= <=<, >=> >> <$!> Alternative <|> ※ >> は歴史的な理由により残されていますが、(>>) = (*>) です。 ※ <$!> は <$> の正格版です。 ここでは説明のため各演算子の型クラス制約を略しま
Set-ExecutionPolicy Bypass -Scope Process -Force;[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; try { Invoke-Command -ScriptBlock ([ScriptBlock]::Create((Invoke-WebRequest https://www.haskell.org/ghcup/sh/bootstrap-haskell.ps1 -UseBasicParsing))) -ArgumentList $true } catch { Write-Error $_ }
('X',1) return set the result value but leave the state unchanged. Comments: return 'X' :: State Int Char runState (return 'X') :: Int -> (Char, Int) initial state = 1 :: Int final value = 'X' :: Char final state = 1 :: Int result = ('X', 1) :: (Char, Int) (1,1) get set the result value to the state and leave the state unchanged. Comments: get :: State Int Int runState get :: Int -> (Int, Int) ini
前回のおさらい どうも、改めましてプロダクト開発部の自称社内関数型担当の福田です。社内でのHaskellの本を読む勉強会を運営しています。 前回は状態を扱う関数を状態計算と定義し、小さな状態計算を連鎖できるような構造を持たせるための定義を行いました。「これで安心安全に状態計算が行える!」と喜び勇んで数多の状態計算を実装しまくるところですが、今回は少し目線を変えた定義を行うことで一風変わった状態計算の表現になる逆状態モナドを紹介します。 前回に比べてHaskellの文法要素も増えるので遅延評価に倣って逆状態モナドが必要になったときに以下を読むことをお勧めします*1。 状態モナド 前回紹介した状態計算を繋げる方法としてApplicativeとMonadのインスタンス定義を行いました。復習も兼ねて一部抜粋します。 instance Applicative (State s) where pure
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く