LoginSignup
2
0

修正:haskellコードの理解(関数合成・複数の`.`)

Last updated at Posted at 2024-01-08

はじめに

辺境のHaskell道場で、賢者におもっくそ鍛えられた件

checkForFactor :: Int -> Int -> Bool
checkForFactor = (.) (== 0) . mod

これをなんとか理解しました。
でも、微妙に納得いってない部分があったんですよね。
その答えがわかったので追記する形です。

問題

checkForFactor :: Int -> Int -> Bool
checkForFactor x y = (.) (== 0) (mod x) y

これが原型です。

  1. mod xでカリー化した1引数関数(定数xを割る、引数yの関数)を返す。
  2. 1の関数を、(== 0)と関数合成。
  3. これで、yを受け取る→mod xによりx % yが計算され、(== 0)に渡される→真偽値が返る、という関数が作れました!

問題は、ここからの変形です。
前の記事ではごちゃごちゃ書きましたが……

解決方法

yの削除

checkForFactor x y = (.) (== 0) (mod x) y -- 1
checkForFactor x = (.) (== 0) (mod x) -- 2

まずは基礎的にf x y = (.) g (h x) yの時、f x = (.) g (h x)です。
1の式checkForFactor x y = (.) (== 0) (mod x) yはつまりf x y = (.) g (h x) yなので、
2checkForFactor x = (.) (== 0) (mod x)に変形できます。

xの削除←ごちゃついたところ

checkForFactor x = (.) (== 0) (mod x) -- 2
checkForFactor x = ((.) (== 0)) (mod x) -- 3
checkForFactor = ((.) (== 0)) . mod -- 4
checkForFactor = (.) (== 0) . mod -- 5

まず、23に変形します。
すると、f x = g (h x)の形になります。
f x = g (h x)のとき、f = g . hのため、
3から4

checkForFactor = ((.) (== 0)) . modが成り立つのです!!

あとは、余分な()を取り除いて、
5checkForFactor = (.) (== 0) . modが導けます。

挙動は

  1. xを部分適用し、mod xが生成される。
  2. mod x(.) (== 0)と合成され、「新しい関数」が生成される。
  3. 「新しい関数」は引数yを受け取り、x `mod` yの結果が0かどうか判定する。

終わりに

ChatGPT先生と協力して、Javascriptでコードを書いてみました。
checkForFactor = (.) (== 0) . modのロジック・挙動を模倣したものです。

//mod
function mod(x) {
	return function (y) {
		return x % y;
	}
}
//(.) (== 0)
function dotEqZero(f) {
	return function (x) {
		return f(x) === 0;
	}
}

//checkForFactor = (.) (== 0) . mod
function checkForFactor(x) {
	return dotEqZero(mod(x))
}

checkForFactor(x)(y)

もやもやがすっきりするの、キモチイイ……
またひとつ強くなってしまった……( •´ω•` )ﻭカンチガイジャナイヨネ?

まあ、すぐ壁にぶつかるんですけどね。
ばらかもんのなるを思い出しますね。
「僕最強。見るものすべてが美しい」状態と、「えっ知らない無理無理 Σ(OωO )」を繰り返すんだと思います、きっと。

わからない方は「アニメ ばらかもん 3話」です。冒頭です。もしくはマンガ11話。
オススメです。
見るものすべてが美しい

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0