4

私はScala に変換しようとしているHaskell でモナド カウンターを定義しましたが、これまでのところ惨めに失敗しています。簡単に言えば、問題はカウンターを状態モナドとして実装することであり、環境からカウンターのインクリメント定数を読み取り、カウンターの履歴 (値のシーケンス) をログに記録します。

私の友人は私の解決策を改善し、次の簡単な解決策を思い付きました。

newtype Counter = Counter Int deriving (Eq)

instance Show Counter where
  show (Counter i) = show i

incWith :: MonadState Counter m => Int -> m ()
incWith n = let incCounter n' (Counter i) = Counter $ i + n'
            in modify (incCounter n)

inc :: (MonadReader Int m, MonadState Counter m, MonadWriter [Counter] m) => m ()
inc = ask >>= incWith >> get >>= tell . (:[])

compute :: (MonadReader Int m, MonadState Counter m, MonadWriter [Counter] m) => m ()
compute =
  local (const 3) $ do
    inc
    inc
    inc
    local (const 5) $ do
      inc
      inc

これを Scala + (Cats | ScalaZ) にコーディングしようとしましたが、成功しませんでした。Cats の最新の安定バージョンにはliftWriterT. そしてReaderWriterStateScalaz私は数時間でその方法を使用するlocal方法を理解できませんでした. そして、それは始まりに過ぎません...

この Haskell ソリューションをシンプルかつエレガントに翻訳するにはどうすればよいでしょうか? (言語で許可されている範囲で)。

サイドノート:

単純なソリューションを Haskell から Scala + FP ライブラリ (Cats、Scalaz) に変換するのに、なぜそんなに多くの時間を費やす必要があるのか​​、まだ理解しようとしています。Haskell では、各型クラスのインスタンスと使用可能な関数を見つけるのは簡単ですが、IntelliJ、GitHub、および StackOverflow を使用する Scala では、これに数日かかります。だから私は何が間違っているのか、どうすればこの状況を改善できるのか疑問に思っています。

4

1 に答える 1