keera-studios / keera-hails Goto Github PK
View Code? Open in Web Editor NEWKeera Hails: Haskell on Rails - Reactive Programming Framework for Interactive Haskell applications
License: Other
Keera Hails: Haskell on Rails - Reactive Programming Framework for Interactive Haskell applications
License: Other
Support for GTK3 right now is lacking. We cannot create complex applications with GTK3 wtihout a lot of boilerplate.
Because this is already done in GTK2, it should be trivial to port to GTK3.
The package documentation is missing, which does not let people know how to use the package or what it does.
https://hackage.haskell.org/package/keera-hails-i18n
The API is poorly documented and it's not intuitive enough to help people understand what this does or how to use it, so they cannot figure it out by themselves.
The function that generates an RV for a field of a record takes string arguments. It might make more sense to use Name
arguments, but then it would be necessary to change the programs that use it.
See mvc-model-protectedmodel/Hails.MVC.Model.THFields.protectedField.
It would be useful to have the trivial demo just added to the library in e22c0bf#diff-f247725f39b33ecfb58291261d453171 copied also as a separate example in the demos/
folder, with its own cabal file, and potentially installed in travis (but not deployed to hackage).
This would make it easier for people to start with Hails, and would ensure that everything keeps working.
This repo contains an .hgignore file which does not belong as we are using git.
My guess is that this was once a mercurial repository and that was never seen or removed.
The deployment on travis fails due to packages being invalid and a path being incorrect:
+cd keera-hails-mvc-model-protectedmodel
+cabal check
These warnings may cause trouble when distributing the package:
* 'ghc-options: -O2' is rarely needed. Check that it is giving a real benefit
and not just imposing longer compile times on your users.
+cabal sdist
Distribution quality warnings:
'ghc-options: -O2' is rarely needed. Check that it is giving a real benefit
and not just imposing longer compile times on your users.
Warning: Cannot run preprocessors. Run 'configure' command first.
Building source dist for keera-hails-mvc-model-protectedmodel-0.0.3.5...
Source tarball created:
dist/keera-hails-mvc-model-protectedmodel-0.0.3.5.tar.gz
+cabal upload dist/keera-hails-mvc-model-protectedmodel-0.0.3.5.tar.gz
Uploading dist/keera-hails-mvc-model-protectedmodel-0.0.3.5.tar.gz...
Error uploading dist/keera-hails-mvc-model-protectedmodel-0.0.3.5.tar.gz: http
code 400
Error: Invalid package
And also:
cd keera-hails-reactive-etwork
sh: 1: cd: can't cd to keera-hails-reactive-etwork
Currently, hails is failing to compile on Travis due togtk2hs-buildtools not building with GHC 8.0. Additionally it is not trying to compile with modern versions of GHC.
The following construction is very common:
installRule cenv = do
f <- someFieldOfAnUIElement <$> someUIElement (uiBuilder (view cenv))
let f2 - someFieldOfTheModel (model cenv))
f =:= f2
The cenv
is being passed around. Ideally, we'd want to write:
installRule =
(someFieldOfAnUIElement . someUIElement) =:= someFieldOfTheModel
An initial approximation would be possible if we make RVs and RRs run on a reader monad with cenv
in the environment. Some additional modifications would be necessary to make model
and uiBuilder.view
somehow implicit, and to make the (<$>
) go away.
These two executables are near duplicates. It does not seem to make sense to have two of the same.
I suggest that keera-hails-templates be removed.
src/Hails/FS.hs:42:20:
Couldn't match type ‘FilePath’ with ‘[Char]’
Expected type: GHC.IO.FilePath
Actual type: FilePath
In the second argument of ‘watchDir’, namely ‘(directory fp)’
In a stmt of a 'do' block:
_ <- watchDir
mgr
(directory fp)
(\ e -> encodeString (eventPath e) == fpP)
(const notify)
src/Hails/FS.hs:43:40:
Couldn't match type ‘[Char]’ with ‘FilePath’
Expected type: FilePath
Actual type: GHC.IO.FilePath
In the first argument of ‘encodeString’, namely ‘(eventPath e)’
In the first argument of ‘(==)’, namely
‘encodeString (eventPath e)’
cabal: Leaving directory '/tmp/cabal-tmp-5631/keera-hails-reactive-fs-0.0.3.4'
The function sendTo is no longer available on network 3.*. This stops
keera-hails-reactive-network from compiling:
Preprocessing library keera-hails-reactive-network-0.1...
[1 of 1] Compiling Hails.Network ( src/Hails/Network.hs, dist/dist-sandbox-d9da2abf/build/Hails/Network.o )
src/Hails/Network.hs:21:33: error:
• Variable not in scope:
sendTo :: Socket -> String -> SockAddr -> IO Integer
• Perhaps you meant ‘sendFd’ (imported from Network.Socket)
It only depends on Gtk very indirectly. It will never invoke Gtk code.
The keera-hails initialization program, which is supposed to be used to create a new app from scratch, is not working. The resulting files include imports that do not exist in any keera-hails-* library at the moment.
The maintainer's address is old and still points to ivan's address. This should just be [email protected].
If I run cabal install keera-hails-reactive-gtk-0.3
with ghc 8.4.3, installation of that package fails with
src/Graphics/UI/Gtk/Reactive/Gtk2.hs:8067:30: error:
• Couldn't match type ‘model’ with ‘Maybe model0’
‘model’ is a rigid type variable bound by
the type signature for:
treeViewSetModelReactive :: forall self model.
(TreeViewClass self, TreeModelClass model) =>
self -> ReactiveFieldWrite IO model
at src/Graphics/UI/Gtk/Reactive/Gtk2.hs:8066:1-113
Expected type: ReactiveFieldWrite IO model
Actual type: ReactiveFieldWrite IO (Maybe model0)
• In the expression: wrapMW (treeViewSetModel w)
In an equation for ‘treeViewSetModelReactive’:
treeViewSetModelReactive w = wrapMW (treeViewSetModel w)
• Relevant bindings include
treeViewSetModelReactive :: self -> ReactiveFieldWrite IO model
(bound at src/Graphics/UI/Gtk/Reactive/Gtk2.hs:8067:1)
|
8067 | treeViewSetModelReactive w = wrapMW (treeViewSetModel w)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
I find the structure of the module and the documentation unhelpful. I think it could be improved, initially with more examples and by moving elements within the module.
Files named sources.txt are related to an old build tool that is no longer used in Haskell and no longer serve any purpose.
Clean the modules including:
Trying to compile haskell-titan on MacOSX with GHC 8.6, I get the following error:
Building library for keera-hails-reactive-gtk-0.3..
[ 1 of 19] Compiling Graphics.UI.Gtk.Reactive.Button ( src/Graphics/UI/Gtk/Reactive/Button.hs, dist/dist-sandbox-f8907eaf/build/Graphics/UI/Gtk/Reactive/Button.o )
src/Graphics/UI/Gtk/Reactive/Button.hs:13:1: warning: [-Worphans]
Orphan instance: instance ReactiveValueActivatable IO Button
To avoid this
move the instance declaration to the module of the class or of the type, or
wrap the type with a newtype and declare the instance on the new type.
|
13 | instance ReactiveValueActivatable IO Button where
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
[ 2 of 19] Compiling Graphics.UI.Gtk.Reactive.CheckMenuItem ( src/Graphics/UI/Gtk/Reactive/CheckMenuItem.hs, dist/dist-sandbox-f8907eaf/build/Graphics/UI/Gtk/Reactive/CheckMenuItem.o )
[ 3 of 19] Compiling Graphics.UI.Gtk.Reactive.MenuItem ( src/Graphics/UI/Gtk/Reactive/MenuItem.hs, dist/dist-sandbox-f8907eaf/build/Graphics/UI/Gtk/Reactive/MenuItem.o )
src/Graphics/UI/Gtk/Reactive/MenuItem.hs:14:1: warning: [-Worphans]
Orphan instance: instance ReactiveValueActivatable IO MenuItem
To avoid this
move the instance declaration to the module of the class or of the type, or
wrap the type with a newtype and declare the instance on the new type.
|
14 | instance ReactiveValueActivatable IO MenuItem where
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
[ 4 of 19] Compiling Graphics.UI.Gtk.Reactive.Property ( src/Graphics/UI/Gtk/Reactive/Property.hs, dist/dist-sandbox-f8907eaf/build/Graphics/UI/Gtk/Reactive/Property.o )
src/Graphics/UI/Gtk/Reactive/Property.hs:125:21: warning: [-Wname-shadowing]
This binding for ‘set’ shadows the existing binding
imported from ‘Graphics.UI.Gtk’ at src/Graphics/UI/Gtk/Reactive/Property.hs:7:1-22
(and originally defined in ‘System.Glib.Attributes’)
|
125 | passivePropertyGE e set get =
| ^^^
src/Graphics/UI/Gtk/Reactive/Property.hs:125:25: warning: [-Wname-shadowing]
This binding for ‘get’ shadows the existing binding
imported from ‘Graphics.UI.Gtk’ at src/Graphics/UI/Gtk/Reactive/Property.hs:7:1-22
(and originally defined in ‘System.Glib.Attributes’)
|
125 | passivePropertyGE e set get =
| ^^^
[ 5 of 19] Compiling Graphics.UI.Gtk.Reactive.Label ( src/Graphics/UI/Gtk/Reactive/Label.hs, dist/dist-sandbox-f8907eaf/build/Graphics/UI/Gtk/Reactive/Label.o )
src/Graphics/UI/Gtk/Reactive/Label.hs:14:1: warning: [-Worphans]
Orphan instance: instance ReactiveValueReadWrite Label String IO
To avoid this
move the instance declaration to the module of the class or of the type, or
wrap the type with a newtype and declare the instance on the new type.
|
14 | instance ReactiveValueReadWrite Label String IO where
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/Graphics/UI/Gtk/Reactive/Label.hs:16:1: warning: [-Worphans]
Orphan instance: instance ReactiveValueRead Label String IO
To avoid this
move the instance declaration to the module of the class or of the type, or
wrap the type with a newtype and declare the instance on the new type.
|
16 | instance ReactiveValueRead Label String IO where
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
src/Graphics/UI/Gtk/Reactive/Label.hs:20:1: warning: [-Worphans]
Orphan instance: instance ReactiveValueWrite Label String IO
To avoid this
move the instance declaration to the module of the class or of the type, or
wrap the type with a newtype and declare the instance on the new type.
|
20 | instance ReactiveValueWrite Label String IO where
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
[ 6 of 19] Compiling Graphics.UI.Gtk.Reactive.Image ( src/Graphics/UI/Gtk/Reactive/Image.hs, dist/dist-sandbox-f8907eaf/build/Graphics/UI/Gtk/Reactive/Image.o )
src/Graphics/UI/Gtk/Reactive/Image.hs:9:1: warning: [-Wunused-imports]
The import of ‘Graphics.UI.Gtk.Reactive.Property’ is redundant
except perhaps to import instances from ‘Graphics.UI.Gtk.Reactive.Property’
To import instances alone, use: import Graphics.UI.Gtk.Reactive.Property()
|
9 | import Graphics.UI.Gtk.Reactive.Property
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
src/Graphics/UI/Gtk/Reactive/Image.hs:14:1: warning: [-Worphans]
Orphan instance: instance ReactiveValueWrite Image String IO
To avoid this
move the instance declaration to the module of the class or of the type, or
wrap the type with a newtype and declare the instance on the new type.
|
14 | instance ReactiveValueWrite Image String IO where
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
[ 7 of 19] Compiling Graphics.UI.Gtk.Reactive.Gtk2 ( src/Graphics/UI/Gtk/Reactive/Gtk2.hs, dist/dist-sandbox-f8907eaf/build/Graphics/UI/Gtk/Reactive/Gtk2.o )
src/Graphics/UI/Gtk/Reactive/Gtk2.hs:3037:25: error:
Not in scope: type constructor or class ‘PlugClass’
|
3037 | plugEmbeddedReactive :: PlugClass self => self -> ReactiveFieldRead IO ()
| ^^^^^^^^^
src/Graphics/UI/Gtk/Reactive/Gtk2.hs:3042:27: error:
Not in scope: type constructor or class ‘PlugClass’
|
3042 | plugGetEmbeddedPassive :: PlugClass self => (self) -> ReactiveFieldRead IO (Bool)
| ^^^^^^^^^
src/Graphics/UI/Gtk/Reactive/Gtk2.hs:3047:21: error:
Not in scope: type constructor or class ‘PlugClass’
|
3047 | plugGetIdPassive :: PlugClass self => (self) -> ReactiveFieldRead IO (NativeWindowId)
| ^^^^^^^^^
src/Graphics/UI/Gtk/Reactive/Gtk2.hs:3052:31: error:
Not in scope: type constructor or class ‘PlugClass’
|
3052 | plugGetSocketWindowPassive :: PlugClass self => (self) -> ReactiveFieldRead IO ((Maybe DrawWindow))
| ^^^^^^^^^
src/Graphics/UI/Gtk/Reactive/Gtk2.hs:3057:27: error:
Not in scope: type constructor or class ‘SocketClass’
|
3057 | afterPlugAddedReactive :: SocketClass self => self -> ReactiveFieldRead IO ()
| ^^^^^^^^^^^
src/Graphics/UI/Gtk/Reactive/Gtk2.hs:3061:29: error:
Not in scope: type constructor or class ‘SocketClass’
|
3061 | afterPlugRemovedReactive :: SocketClass self => self -> ReactiveFieldRead IO ()
| ^^^^^^^^^^^
src/Graphics/UI/Gtk/Reactive/Gtk2.hs:3065:24: error:
Not in scope: type constructor or class ‘SocketClass’
|
3065 | onPlugAddedReactive :: SocketClass self => self -> ReactiveFieldRead IO ()
| ^^^^^^^^^^^
src/Graphics/UI/Gtk/Reactive/Gtk2.hs:3069:26: error:
Not in scope: type constructor or class ‘SocketClass’
|
3069 | onPlugRemovedReactive :: SocketClass self => self -> ReactiveFieldRead IO ()
| ^^^^^^^^^^^
src/Graphics/UI/Gtk/Reactive/Gtk2.hs:3073:23: error:
Not in scope: type constructor or class ‘SocketClass’
|
3073 | socketGetIdPassive :: SocketClass self => (self) -> ReactiveFieldRead IO (NativeWindowId)
| ^^^^^^^^^^^
src/Graphics/UI/Gtk/Reactive/Gtk2.hs:3078:31: error:
Not in scope: type constructor or class ‘SocketClass’
|
3078 | socketGetPlugWindowPassive :: SocketClass self => (self) -> ReactiveFieldRead IO ((Maybe DrawWindow))
| ^^^^^^^^^^^
src/Graphics/UI/Gtk/Reactive/Gtk2.hs:3083:28: error:
Not in scope: type constructor or class ‘SocketClass’
|
3083 | socketPlugAddedReactive :: SocketClass self => self -> ReactiveFieldRead IO ()
| ^^^^^^^^^^^
cabal: Leaving directory '/var/folders/mj/_59m6kx170d40r37x8lv0gs00000gq/T/cabal-tmp-14426/keera-hails-reactive-gtk-0.3'
The cabal file in this directory is not fully compliant with our current policy: the version bounds are not separated by a space in cabal-version, and the unit test suite is just not formatted.
Clean the modules in keera-hails-18n including:
Everything produced at/for/by Keera has copyright Keera Studios. All software, talks, pages, papers, public or private, released or under development, need to have clear copyright and usage licenses.
We are getting this on travis:
Building keera-hails-reactive-network-0.0.3.3...
Preprocessing library keera-hails-reactive-network-0.0.3.3...
[1 of 1] Compiling Hails.Network ( src/Hails/Network.hs, dist/dist-sandbox-d9da2abf/build/Hails/Network.o )
src/Hails/Network.hs:5:1: error:
Failed to load interface for ‘Network.BSD’
It is a member of the hidden package ‘network-bsd-2.8.1.0’.
Perhaps you need to add ‘network-bsd’ to the build-depends in your .cabal file.
Use -v to see a list of the files searched for.
cabal: Leaving directory '/home/travis/build/keera-studios/keera-hails/keera-hails-reactive-network'
GHC 8.0 fails to compile gtk2hs-buildtools.
I made a mistake in commit 2932ac3 keeping 8.0 when I thought I had removed it.
It needs to be removed.
One of the packages provided by this library is keera-hails, which lets users build sample applications. This package is not documented, so it is unlikely that any users have been able to use it as is.
A minimal readme would help newcomers see an app running on the screen with very little effort.
Subissue of #7 .
The TODO file in that folder is empty and not necessary.
Include a demo of a portable app that contains an HTML view.
The problem pointed out in #8 has been corrected by commit bd7019f. But, the fixed library has not been uploaded to Hackage (last upload was in 2015), meaning the Hackage version still does not compile with the current version of the gtk library (0.15.2).
It would be nice if a new version was uploaded that contained the fix :)
This project is hard to maintain due to being formed of many smaller packages.
We want to make the cabal packages as uniform as possible.
There is a .hackage file in the repo.
I do not find any evidence that this file is being used anywhere.
Should it be removed?
The package keera-hails-reactive-network has an upgrade that needs to be made available on hackage.
A new version must be released.
Certain reactive constructs like dialogs do not yet integrate well with RVs.
An example, from https://github.com/keera-studios/haskell-titan/blob/develop/titan-gui/src/Controller/Conditions/Buttons.hs#L89, is:
installConditionLoadTrace cenv = void $ do
btn <- toolButtonActivateField <$> toolBtnLoadTrace (uiBuilder (view cenv))
btn =:> conditionVMLoadTrace cenv
conditionVMLoadTrace :: CEnv -> IO ()
conditionVMLoadTrace cenv = do
window <- mainWindow (uiBuilder (view cenv))
fch <- fileChooserDialogNew (Just "Open Yampa trace") Nothing
FileChooserActionOpen
[("Cancel", ResponseCancel),
("Load", ResponseAccept)]
ytrfilt <- fileFilterNew
fileFilterAddPattern ytrfilt "*.ytr"
fileFilterSetName ytrfilt "Yampa Trace"
fileChooserAddFilter fch ytrfilt
nofilt <- fileFilterNew
fileFilterAddPattern nofilt "*.*"
fileFilterSetName nofilt "All Files"
fileChooserAddFilter fch nofilt
widgetShow fch
response <- dialogRun fch
fp <- case response of
ResponseCancel -> putStrLn "You cancelled..." >> return Nothing
ResponseAccept -> do nwf <- fileChooserGetFilename fch
case nwf of
Nothing -> putStrLn "Nothing" >> return Nothing
Just path -> putStrLn ("New file path is:\n" ++ path) >> return (Just path)
ResponseDeleteEvent -> putStrLn "You closed the dialog window..." >> return Nothing
widgetDestroy fch
awhen fp $ \p -> do
contents <- readFile p
sendToYampaSocketAsync (extra cenv) (show (LoadTraceFromString contents))
Instead, one could think of this dialog as a sort-of fudget or reactive processor. If synced, it could be described with something like:
(toolButtonActivateField . toolBtnLoadTrace) =>= openFileDialog =>= loadFile =:> sendNewTrace
The notebookGetCurrentPagePassive function returns -1 in my program.
Create a new notebook n
n <- notebookNew
Define notebookGetCurrentPagePassive as the getter of curPageRV
let curPageRV = ReactiveFieldReadWrite setter getter notifier where (ReactiveFieldRead getter _) = notebookGetCurrentPagePassive n setter = postGUIAsync . notebookSetCurrentPage n notifier io = void $ afterSwitchPage n (const io)
When the current page is deleted and reactiveValueRead curPageRV is called, sometimes it will return -1.
reactiveValueRead curPageRV >>= print
When the current page is deleted, will notebookGetCurrentPagePassive always return -1? How does this function show the passive effect?
Files named sources.txt are related to an old build tool that is no longer used in Haskell and no longer serve any purpose.
The readme should include examples of how reactive values can be created, manipulated, and connected, including how to create connections to Gtk/Wx/HTML or maybe Yampa stuff.
I am currently getting the following error message compiling on Mac:
[ 7 of 19] Compiling Graphics.UI.Gtk.Reactive.Gtk2 ( src/Graphics/UI/Gtk/Reactive/Gtk2.hs, dist/dist-sandbox-eaed1e6b/build/Graphics/UI/Gtk/Reactive/Gtk2.o )
src/Graphics/UI/Gtk/Reactive/Gtk2.hs:4462:41: error:
• Could not deduce (DrawWindowClass d)
arising from a use of ‘drawableGetID’
from the context: DrawableClass d
bound by the type signature for:
drawableGetIDPassive :: forall d.
DrawableClass d =>
d -> ReactiveFieldRead IO NativeWindowId
at src/Graphics/UI/Gtk/Reactive/Gtk2.hs:4461:1-87
Possible fix:
add (DrawWindowClass d) to the context of
the type signature for:
drawableGetIDPassive :: forall d.
DrawableClass d =>
d -> ReactiveFieldRead IO NativeWindowId
• In the first argument of ‘wrapMRPassive’, namely
‘(drawableGetID w)’
In the expression: wrapMRPassive (drawableGetID w)
In an equation for ‘drawableGetIDPassive’:
drawableGetIDPassive w = wrapMRPassive (drawableGetID w)
|
4462 | drawableGetIDPassive w = wrapMRPassive (drawableGetID w)
What can I do?
The build on hackage failed with the following message:
src/Hails/MVC/Model/ProtectedModel/Reactive.hs:66:50:
Expecting one more argument to ‘ReactiveFieldReadWrite a’
Expected a type, but ‘ReactiveFieldReadWrite a’ has kind ‘* -> *’
In the type ‘ProtectedModel b c -> ReactiveFieldReadWrite a’
In the type declaration for ‘FieldAccessor’
Changes in #18 need to be pushed to hackage.
The package documentation is missing, which does not let people know how to use the package or what it does.
http://hackage.haskell.org/package/keera-hails-mvc-environment-gtk
The API is poorly documented and it's not intuitive enough to help people understand what this does or how to use it, so they cannot figure it out by themselves.
Release a new version of the hails library.
The demo included with hails fails to compile to it the accompanying package having a low version bound for base
.
The reactive programming library dunai can be used to run reactive applications.
Hails applications could connect to those dunai applications by turning the former into MSFs, or the latter into RVs.
We need examples of this.
This file contains a pending idea but it does not belong in the repo if we are relying on an issue tracker.
The package documentation is missing, which does not let people know how to use the package or what it does.
http://hackage.haskell.org/package/keera-hails-mvc-controller
The API is poorly documented and it's not intuitive enough to help people understand what this does or how to use it, so they cannot figure it out by themselves.
Citing from http://hydra.cryp.to/build/1377268/nixlog/1/raw:
Test suite hlint: RUNNING...
src/Data/ReactiveValue.hs:230:3: Error: Eta reduce
Found:
reactiveValueWrite (_, f) v = reactiveValueWrite f v
Why not:
reactiveValueWrite (_, f) = reactiveValueWrite f
1 suggestion (5 ignored)
Test suite hlint: FAIL
and
Test suite haddock-coverage: RUNNING...
haddock-coverage: cabal: readCreateProcessWithExitCode: runInteractiveProcess: exec: does not exist (No such file or directory)
Test suite haddock-coverage: FAIL
Multiple packages in this repo contain an hlint.hs and an HLint.hs under tests/.
The difference between uppercase and lowercase names is frequent on linux, but not on mac or windows. This would make it very hard to use these projects on those architectures, and would confuse cabal and git.
These files should be named differently. The cabal file needs to be adapted accordingly.
The minimal example included with the wx backend fails to compile:
$ cabal exec -- ghc --make keera-hails/keera-hails-reactive-wx/examples/Minimal.hs
[1 of 1] Compiling Main ( keera-hails/keera-hails-reactive-wx/examples/Minimal.hs, keera-hails/keera-hails-reactive-wx/examples/Minimal.o )
keera-hails/keera-hails-reactive-wx/examples/Minimal.hs:28:20: error:
• Couldn't match type ‘[Char]’ with ‘() -> [Char]’
Expected type: [Char] -> () -> [Char]
Actual type: [Char] -> [Char]
• In the first argument of ‘modRW’, namely ‘((++ "a"))’
In the second argument of ‘(=:>)’, namely ‘modRW ((++ "a")) txt2T’
In a stmt of a 'do' block: btnC =:> modRW ((++ "a")) txt2T
|
28 | btnC =:> modRW ((++ "a")) txt2T
Markdown renders nicer on github.
We could use the same format and structure for all packages.
Clean the modules including:
The library keera-hails contains unused files in src/
.
Many of those files appear to exist in other libraries, so I do not understand why they are included in keera-hails. I think they should be removed.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.