Tôi đang sử dụng thư viện Hoopl và muốn thực hiện một số trạng thái xung quanh khi viết lại. Các hàm viết lại có tính đa hình liên quan đến đơn nguyên được sử dụng, nhưng tôi không thể tìm ra cách kết hợp một đơn nguyên State
với một trong các monome Fuel
của thư viện.Làm cách nào để kết hợp CheckingFuelMonad với một đơn vị Tiểu bang trong Hoopl?
Dưới đây là ví dụ tối thiểu. MyMonad
là một từ đồng nghĩa kết hợp số CheckingFuelMonad
của Hoopl và một đơn vị State
mang cờ. Stmt
chỉ là một trình giữ chỗ cho ngôn ngữ trung gian của tôi và không thực sự quan trọng.
{-# LANGUAGE GADTs, RankNTypes #-}
import Compiler.Hoopl
import Control.Monad.State
type MyMonad = CheckingFuelMonad (State Bool)
data Stmt e x where
Bind ::() -> Stmt O O
rewriter :: forall e x. Stmt e x -> Fact x() -> MyMonad (Maybe (Graph Stmt e x))
rewriter (Bind())() = return $ do
f <- get
if f
then return $ Just emptyGraph
else return Nothing
Nhưng điều này sẽ không biên dịch - GHC phàn nàn rằng rewrite
có kiểu sai:
Couldn't match expected type `Graph' Block Stmt e x'
against inferred type `Maybe (g n O O)'
Expected type: CheckingFuelMonad
(State Bool) (Maybe (Graph Stmt e x))
Inferred type: CheckingFuelMonad
(State Bool) (Maybe (Maybe (g n O O)))
phải là những gì tôi muốn làm tốt? Làm cách nào để tôi có thể viết chính xác chức năng rewrite
?
Tôi cực kỳ không tin rằng việc viết lại này là âm thanh. Đây là hoạt động kinh doanh rất tinh ranh. –