Совместимость с Java во Фреге, особенно в IO Monad

Я хотел бы перевести этот код Java на Фреге Хаскелл:

    PApplet pApplet = new PApplet();
    System.out.print(pApplet.toString());
    PApplet.runSketch(new String[]{"test"}, pApplet);

Я сделал так далеко:

data PApplet = mutable native processing.core.PApplet
  where
    native new :: () -> IO PApplet
    native toString :: PApplet -> IO String

native runSketch processing.core.PApplet.runSketch
  :: ArrayOf RealWorld String -> PApplet -> IO ()

main _ = do p <- PApplet.new
            pStr <- p.toString
            putStrLn pStr
            args = JArray.fromList ["test"]
            runSketch args p

Часть до main компилируется, но потом я получаю эти ошибки:

E Process.fr:14: type error in expression fromList ("test":[])
    type is : STMutable t1 (JArray String)
    expected: ArrayOf RealWorld String
E Process.fr:15: type error in expression p
    type is : IO PApplet
    expected: PApplet
E Process.fr:12: type error in expression >>= p.toString (λpStr -> >> (putStrLn pStr) (runSketch (fromList ("test":[])) p))
    type is : IO ()
    expected: ()→t1
E Process.fr:11: type error in expression λp -> >>= p.toString (λpStr -> >> (putStrLn pStr) (runSketch (fromList ("test":[])) p))
    type is : IO ()
    expected: ()→t1
E Process.fr:11: type error in expression >>= new (λp -> >>= p.toString (λpStr -> >> (putStrLn pStr) (runSketch (fromList ("test":[])) p)))
    type is : ()→t1
    expected: IO ()
E Process.fr:11: type error in expression λ_ -> >>= new (λp -> >>= p.toString (λpStr -> >> (putStrLn pStr) (runSketch (fromList ("test":[])) p)))
    type is : ()→t1
    expected: IO ()
E Process.fr:12: can't find a type for  p.toString `toString`
    is neither an overloaded function nor a member of  IO PApplet

Я стараюсь соответствовать критериям компилятора, но безуспешно. После бесчисленных случайных комбинаций этот фрагмент выше кажется мне наиболее разумным. Нужны ли подсказки типа в do блок? Я не понимаю почему p <- PApplet.new оценивает в IO PApplet? и как сделать JArray.fromList возвращать ArrayOf RealWorld String? Фреге великолепен, но совместимость довольно устрашающая. Можно ли сфокусироваться на этом на Frege Github?

1 ответ

Решение

У тебя есть

ST s X

и вы хотите

X

и ты в IOчто ничего кроме ST RealWorld

Таким образом, наиболее естественным решением было бы = с <- в соответствии

args = JArray.fromList ["test"]

и все готово!

Конечно, вся история немного сложна из-за псевдонимов типов:

type ArrayOf a x = Mutable a (JArray x)
type STMutable s a = ST s (Mutable s a)

Если бы де-алиасер выбрал перевод

ST s (Mutable s (JArray String))

вернуться к

ST s (ArrayOf s String)

Вы, вероятно, видели бы это.

Другие вопросы по тегам