canalun
こんばんは。学習のために色々な処理をfunctionalなアプローチで書いてみる中で浮かんだ疑問です。
手続き的な書き方は難しくないのに、functionalに書こうと思うと急に難度があがる処理があるように感じ始めています。
当たり前のことなのですが、これは慣れるしかないのですよね……?
自分には到底書けないよと思う処理も、関数型言語に慣れ親しむうちに処理が書けるようになっていくのでしょうか?:smiling_face_with_tear:
例えば`List.GroupBy`をあえて自分で実装するとなると、
手続き型では「forループを回して、毎要素ペアを条件判定し、適宜新しい配列を作成したり既存の配列に追加したり」で済むところが、
関数型では下記のように(*私にとっては*)難しい書き方になってしまいます。
自力では書けなかったので、 を引用しています(正直、このコードにバグがあるかどうかも私には自信を持っては分かりません)。
このような処理を書けるようになるためには、他言語の習得と同様に練習するしかないのですよね……!
すみません、とても当たり前のことしか言っていないのですが、難しさに圧倒されて思わず何かご意見を伺いたくなってしまい……:eyes:
手続き的な書き方は難しくないのに、functionalに書こうと思うと急に難度があがる処理があるように感じ始めています。
当たり前のことなのですが、これは慣れるしかないのですよね……?
自分には到底書けないよと思う処理も、関数型言語に慣れ親しむうちに処理が書けるようになっていくのでしょうか?:smiling_face_with_tear:
例えば`List.GroupBy`をあえて自分で実装するとなると、
手続き型では「forループを回して、毎要素ペアを条件判定し、適宜新しい配列を作成したり既存の配列に追加したり」で済むところが、
関数型では下記のように(*私にとっては*)難しい書き方になってしまいます。
myGroupBy :: (a -> a -> Bool) -> [a] -> [[a]] myGroupBy p xs = foldl step [] xs where step ys x | null ys = (x:[]):ys | p (head (last ys)) x = (init ys) ++ (((last ys) ++ (x:[])):[]) | otherwise = ys ++ ((x:[]):[])
自力では書けなかったので、
このような処理を書けるようになるためには、他言語の習得と同様に練習するしかないのですよね……!
すみません、とても当たり前のことしか言っていないのですが、難しさに圧倒されて思わず何かご意見を伺いたくなってしまい……:eyes: