是否有任何Frege相当于Haskell,getLine并read从标准库中的控制台解析输入?
目前我这样做:
import frege.IO
getLine :: IO String
getLine = do
isin <- stdin
isrin <- IO.InputStreamReader.new isin
brin <- IO.BufferedReader.fromISR isrin
line <- brin.readLine
return $ fromExceptionMaybe line
fromExceptionMaybe :: Exception (Maybe a) -> a
fromExceptionMaybe (Right (Just r)) = r
fromExceptionMaybe (Right _) = error "Parse error on input"
fromExceptionMaybe (Left l) = error l.getMessage
pure native parseInt java.lang.Integer.parseInt :: String -> Int
main _ = do
line <- getLine
println $ parseInt line …Run Code Online (Sandbox Code Playgroud) Java 8有一个名为Nashorn的内置JavaScript引擎,因此实际上可以在JVM上运行编译为JavaScript的Haskell.
以下程序有效:
{-# LANGUAGE JavaScriptFFI #-}
module Main where
foreign import javascript unsafe "console={log: function(s) { java.lang.System.out.print(s); }}"
setupConsole :: IO ()
foreign import javascript unsafe "java.lang.System.exit($1)"
sysexit :: Int -> IO ()
main = do
setupConsole
putStrLn "Hello from Haskell!"
sysexit 0
Run Code Online (Sandbox Code Playgroud)
我们可以运行它:( 旁注:可以将它作为普通的Java程序运行.jjs只是在JVM上运行纯JavaScript代码的便捷方式)
$ ghcjs -o Main Main.hs
[1 of 1] Compiling Main ( Main.hs, Main.js_o )
Linking Main.jsexe (Main)
$ which jjs
~/bin/jdk/bin/jjs
$ jjs Main.jsexe/all.js
Hello from Haskell!
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,console.log需要使用java.lang.System.print …
作为练习,我将这些Scala和Java的Akka示例移植到了Frege.虽然它工作正常,但它比Scala(540ms)对应的运行速度慢(11s).
module mmhelloworld.akkatutorialfregecore.Pi where
import mmhelloworld.akkatutorialfregecore.Akka
data PiMessage = Calculate |
Work {start :: Int, nrOfElements :: Int} |
Result {value :: Double} |
PiApproximation {pi :: Double, duration :: Duration}
data Worker = private Worker where
calculatePiFor :: Int -> Int -> Double
calculatePiFor !start !nrOfElements = loop start nrOfElements 0.0 f where
loop !curr !n !acc f = if n == 0 then acc
else loop (curr + 1) (n - 1) (f acc …Run Code Online (Sandbox Code Playgroud) 在Haskell中,以下代码打印"[1,2,3,4,5":
foo = take 10 $ show $ numbersFrom 1 where
numbersFrom start = start : numbersFrom (start + 1) -- could use [1..]
Run Code Online (Sandbox Code Playgroud)
但在弗雷格,它抛出OutOfMemoryError以下代码:
foo = take 10 $ unpacked $ show $ numbersFrom 1 where
numbersFrom start = start : numbersFrom (start + 1)
Run Code Online (Sandbox Code Playgroud)
这里唯一的区别是unpacked转换String为[Char]和FWIW所需的unpacked功能,功能是急切的.为什么整个表达式不能像Haskell一样懒惰?是否有可能在弗雷格实现与Haskell相似的东西?
scala> Float.floatToI
Run Code Online (Sandbox Code Playgroud)
在此处按下选项卡时,会显示Float.floatToIntBits.但,
scala> Float.floatToIntBits(2f)
<console>:6: error: value floatToIntBits is not a member of object Float
Float.floatToIntBits(2f)
^
Run Code Online (Sandbox Code Playgroud) 我试图计算一个数字列表的倒数.以下Frege程序适用于少量数字,但抛出StackOverflowError为100000个数字.
import frege.IO
inversionCount [] _ = (0, [])
inversionCount [x] _ = (0, [x])
inversionCount xs n = (count, sorted) where
count = lcount + rcount + mergecount
(lcount, lsorted) = inversionCount left lsize
(rcount, rsorted) = inversionCount right rsize
(mergecount, sorted) = inversionMergeCount lsorted lsize rsorted rsize (0, [])
(left, right) = splitAt mid xs
mid = n `quot` 2
lsize = mid
rsize = n - mid
inversionMergeCount xs _ [] _ (acc,sorted) = (acc, reverse sorted …Run Code Online (Sandbox Code Playgroud) 是否可以将找到的单词插入到替换中?
$(function() {
content = 'hallo mein name ist peter und ich komme aus berlin. Und du?';
words = 'mein na,berlin'
words = words.replace(/,/,'\|');
words = words.replace(/\s/,'\\s');
regex = new RegExp(words,'gi');
content = content.replace(regex,'<strong>*insert here the word that was found*</strong>');
alert(''+content+'');
});
Run Code Online (Sandbox Code Playgroud)
工作示例 http://www.jsfiddle.net/V9Euk/227/
提前致谢!彼得