下面是在运行时抛出调度错误的Haskell/C FFI代码(GHC7.0.3,MacOS10.7,x86_64)。我搜索了错误的解释,但没有找到任何相关的东西。
C代码(mt.c):
#include <pthread.h>
#include <stdio.h>
typedef void(*FunctionPtr)(int);
/* This is our thread function. It is like main(), but for a thread*/
void *threadFunc(void *arg)
{
FunctionPtr fn;
我正在尝试用GHC编译以下代码:
module Test where
import Maybe
import Prelude hiding (null)
import System.IO
null = ()
main :: IO ()
main = putStrLn "Hello, world!"
如果我只运行ghc Test.hs,我会得到:
Could not find module `Maybe'
It is a member of the hidden package `haskell98-2.0.0.1'.
所以我试着使用ghc -package
现在正在通过真实世界的Haskell工作。这是本书中一个非常早的练习的解决方案:
-- | 4) Counts the number of characters in a file
numCharactersInFile :: FilePath -> IO Int
numCharactersInFile fileName = do
contents <- readFile fileName
return (length contents)
我的问题是:你将如何测试这个函数?有没有一种方法可以进行“模拟”输入,而不是真正需要与文件系统交互来测试它?Haskell将重点
看来Haskell的IO相对比较慢。
例如,将Haskell与Python进行比较
#io.py
import sys
s=sys.stdin.read()
sys.stdout.write(s)
,
-- io.hs
main = do
s <- getContents
putStr s
它们的性能(gen.py将512 k数据写入标准输出):
Python版本:
$ time python gen.py | python io.py > /dev/null
real 0m0.203s
user 0m0.015s
sys 0m0.000s
H
我正在努力学习Haskell以适应函数式编程语言。我决定先在上尝试几个问题。我在读取stdin和使用haskell的lazy io执行io时遇到了问题。
大多数问题都有来自stdin的数据,格式如下:
n
data line 1
data line 2
data line 3
...
data line n
其中n是来自stdin的后续行数,下一行是数据。
如何在n行中的每一行上运行程序,并将解决方案返回给stdout?
我知道stdin输入不会很大,但我要求每次计算一行,假装输入大于内存中可以容纳的大小,只是为了学习如何使用haskell。
我对NixOS相当陌生,正在尝试使用以下函数从Haskell程序中调用emacs:
ediff :: String -> String -> String -> IO ()
ediff testName a b = do
a' <- writeSystemTempFile (testName ++ ".expected") a
b' <- writeSystemTempFile (testName ++ ".received") b
let quote s = "\"" ++ s
好了,我是Haskell IO的新手。我读了很多关于Haskell函数中的IO和副作用的文章,现在我开始在Haskell中做一些自己的副作用,我想知道-我如何真正地编写这些东西?
我有以下函数,在运行其中一行代码后,我想执行一些打印操作,前面几行中的注释解释了这一点。
我非常确定我需要更改函数的类型签名,也许我需要使用“可能”。也许它甚至不可能这样做,我必须完全重写它?我真的不知道--但我在寻找指导。我该如何包含这个功能呢?
interpret_statement :: Prog -> Vars -> Stmt -> Vars -- one third of the debu
如果我想调用多个C函数,每个函数都取决于前一个函数的结果,那么创建一个处理这三个调用的包装器C函数是不是更好?它的成本是否与使用Haskell FFI而不转换类型相同?
假设我有以下Haskell代码:
foo :: CInt -> IO CInt
foo x = do
a <- cfA x
b <- cfB a
c <- cfC c
return c
每个函数cf*都是一个C调用。
在性能方面,创建一个像cfABC这样的C函数,并且只在Haskell中进行一次外部调用是不是更好?
int cfABC(int x) {
int a, b, c;
作为一名前C++程序员,Haskell线程的行为令人困惑。请参阅以下Haskell代码片段:
import Control.Concurrent
import Control.Concurrent.MVar
import Data.Functor.Compose
import System.Random
randomTill0 :: MVar () -> IO () -- Roll a die until 0 comes
randomTill0 mV = do
x <- randomRIO (0,65535) :: IO Int
if 0 == x
我在尝试运行一个简单的Haskell程序。
以下是代码:
{-# LANGUAGE OverloadedStrings #-}
module Lib
( someFunc
) where
import qualified Data.Text.IO as T
someFunc :: IO ()
someFunc = T.putStrLn "someFunc1"
lucky :: (Integral a) => a -> String
lucky 7 = "LUCKY NUMBER SEVEN!"
let a = lucky 7
我已经写了一小段代码来处理控制台的输入:
main :: IO ()
main = do
input <- readLine "> "
loop input
loop :: String -> IO ()
loop input = do
case input of
[] -> do
new <- readLine "> "
loop new
"quit" ->
return ()
_ -> do
handleCom
在Haskell中,当且仅当x是整数时,如何打印没有小数点的小数x?请在下面改进我的代码:
printFrac :: (Show a, RealFrac a) => a -> IO ()
printFrac x = if x==fromIntegral (round x) then print (round x) else print x