Совместимость с 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)
Вы, вероятно, видели бы это.