Существует способ использования Java из Matlab, в частности класса java.awt.Robot
. См. здесь .
По-видимому, существуют два типа программ, касающихся того, как они работают при вызове из Matlab с system('...')
:
WinRAR
(по крайней мере, на моей машине с Windows 7). explorer
(стандартный проводник файлов Windows). Теперь можно сразу же запустить выполнение в Matlab даже для программ типа 1: просто добавьте &
в конце строки, переданной в system
. Это стандарт в оболочке Linux Bash , и он также работает в Windows, как обсуждалось здесь здесь .
Итак, вы будете действовать следующим образом:
robot = java.awt.Robot;
command = '"C:\Program Files (x86)\WinRAR\WinRAR"'; %// external program; full path
system([command ' &']); %// note: ' &' at the end
pause(5) %// allow some time for the external program to start
robot.keyPress (java.awt.event.KeyEvent.VK_ENTER); %// press "enter" key
robot.keyRelease (java.awt.event.KeyEvent.VK_ENTER); %// release "enter" key
Вторая функция неверна из-за ее типа: Tree a -> Tree b
, тогда как foldTree
ожидает, что она будет a -> b
, где a
взято из Tree a
. b
требуется mapTree
, чтобы быть Tree b
, поэтому третий аргумент для foldTree
должен иметь тип a -> Tree b
.
Итак, самая простая фиксированная версия вашего transFunc
:
mapTree :: forall a b. (a -> b) -> Tree a -> Tree b
mapTree f tree = foldTree Node transFunc tree
where transFunc :: a -> Tree b
transFunc x = Leaf (f x)
Обратите внимание, что вам нужно включить расширение ScopedTypeVariables
для его компиляции.
И эта версия transFunc
является эквивалентом вашего рабочего решения: (Leaf . f)