小编Cha*_*ham的帖子

用C之间用Java调用Haskell

这可能听起来像是一场噩梦,但我真的很想让它发挥作用.我大部分时间都在使用这个例子:从Haskell调用C并尝试在ubuntu上运行.

我在java中运行它:

package test;

public class JniTest {
    public native int fib(int x);
}
Run Code Online (Sandbox Code Playgroud)

使用javah创建.h文件之后的这个:(test_JniTest.c)

#include "test_JniTest.h"
#include "Safe_stub.h"

JNIEXPORT jint JNICALL Java_test_JniTest_fib(JNIEnv * e, jobject o, jint f)
{
  return fibonacci_hs(f);
}
Run Code Online (Sandbox Code Playgroud)

然后在haskell中引用(在存根之前):( Safe.hs)

module Safe where

import Foreign.C.Types

fibonacci :: Int -> Int
fibonacci n = fibs !! n
    where fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

fibonacci_hs :: CInt -> CInt
fibonacci_hs = fromIntegral . fibonacci . fromIntegral

foreign export ccall …
Run Code Online (Sandbox Code Playgroud)

c java linux ubuntu haskell

19
推荐指数
1
解决办法
795
查看次数

Haskell Typeclass for Tuples

我正在玩类型类,并做了这个:

class Firstable f where
  fst :: f a -> a

class Secondable f where
  snd :: f a -> a
Run Code Online (Sandbox Code Playgroud)

然后我尝试为(,)添加一个实现,并意识到我可以这样做:

instance Secondable ((,) a) where
  snd (x,y) = y
Run Code Online (Sandbox Code Playgroud)

我很确定这是有效的,因为Secondable应该有类型(* - >*)其中((,)a)具有该类型,但是,我不知道如何为((,)*a)实现Firstable,其中*是绑定变量,在我的解释中,我试图做相当于:

instance Firstable (flip (,) a) where ...
Run Code Online (Sandbox Code Playgroud)

在Haskell有办法做到这一点吗?最好没有延期?

谢谢!

haskell typeclass

15
推荐指数
2
解决办法
2548
查看次数

在Haskell中混合使用Monads

我正在尝试使用haskell中的Ubigraph,但我相信我的问题更通用.我正在尝试编译:

import Graphics.Ubigraph
import Control.Monad
import System.Posix.Unistd

main = do
    h <- initHubigraph "http://127.0.0.1:20738/RPC2"
    runHubigraph op h

op = do
  clear
  vs <- mapM (const newVertex) [0..200]
  mapM_ (setVAttr (VShape Sphere)) vs
  putStrLn "something"
  let bind i = zipWithM (\a b -> newEdge (a,b)) vs (drop i vs ++ take i vs)
  mapM_ bind [1..15]
  mapM_ (removeVertex) vs
  return ()
Run Code Online (Sandbox Code Playgroud)

我正在接受

Couldn't match expected type `Control.Monad.Trans.Reader.ReaderT
                                Ubigraph IO a0'
            with actual type `IO ()'
In the return type of a …
Run Code Online (Sandbox Code Playgroud)

monads haskell monad-transformers

10
推荐指数
1
解决办法
1314
查看次数

懒惰地评估Haskell中的monadic函数

我似乎无法弄清楚我遇到的这个问题的解决方法.

我有这样的事情:

  getFilePathForDay :: Day -> IO (Maybe FilePath)

  getFilePathForDays date days = do
      files <- mapM getFilePathForDay $ iterate (addDays 1) date
      return . take days . catMaybes $ files
Run Code Online (Sandbox Code Playgroud)

我试图得到x个有效的文件路径,其中x是我想要的天数,但上面的代码只是永远运行.我在使用monads时遇到过这个问题,我想知道是否有一个解决方法可用于我遇到的这个问题.

谢谢!

monads haskell lazy-evaluation

8
推荐指数
1
解决办法
299
查看次数

找到满足给定f的属性的最大f在其参数中不减少

这一直困扰着我.

假设你有一个函数fxy,其中x和y是整数,你知道f在其参数中严格不减少,

即f(x + 1)y> = fxy和fx(y + 1)> = fx y.

在x和y有界的情况下,找到满足属性的最大fxy的最快方法是什么.

我当时认为这可能是鞍背搜索的变种,我想知道是否有这种类型问题的名称.

另外,更具体地说,我想知道如果你知道f是乘法运算符,是否有更快的方法来解决这个问题.

谢谢!

编辑:看到下面的评论,该属性可以是任何东西

给定属性g(其中g取值并返回布尔值)我只是寻找最大的f,使得g(f)== True

例如,一个天真的实现(在haskell中)将是:

maximise :: (Int -> Int -> Int) -> (Int -> Bool) -> Int -> Int -> Int
maximise f g xLim yLim = head . filter g . reverse . sort $ results
    where results = [f x y | x <- [1..xLim], y <- [1..yLim]]
Run Code Online (Sandbox Code Playgroud)

algorithm math haskell

7
推荐指数
1
解决办法
306
查看次数

从C调用Haskell FFI函数Ptrs

我试图让以下代码工作:

sample_hs :: CInt -> (CInt -> CInt)
sample_hs x = (x+)

foreign export ccall sample_hs :: CInt -> (CInt -> CInt)
Run Code Online (Sandbox Code Playgroud)

我希望能够在c中做这样的事情:

pf = sample_hs(2);
result = pf(3); //Should be 5;
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试这样做时,我收到一条错误消息:

错误:函数'sample_hs'的参数太少

我猜这个语言之间的接口不起作用我怎么想.有没有办法做我想做的事情?

c haskell ffi

7
推荐指数
1
解决办法
934
查看次数

Cabal使用enable-shared标志重建所有内容

我在使用ghc构建共享库时遇到问题,我认为我需要使用--enable-shared重建我的haskell软件包,是否有一种简单的方法可以使用标志重新构建我的所有软件包--enable-shared ?

haskell ghc cabal haskell-platform

7
推荐指数
1
解决办法
2700
查看次数

ghc 7.4.1不生成stub.o文件

我在Ubuntu上运行默认的Haskell平台安装,当我运行这个例子时,http://www.haskell.org/haskellwiki/Calling_Haskell_from_C "ghc -c -O Safe.hs"没有生成Safe_stub.o文件.我已经在朋友盒上以及32位和64位Ubuntu安装上单独安装Ubuntu进行了检查.

有人可以确认这是否特定于ghc-7.4.1或仅安装Ubuntu?

谢谢!

haskell ffi ghc haskell-platform

6
推荐指数
1
解决办法
344
查看次数

在没有缓冲的情况下读取大文件中的大行

我想知道是否有一种简单的方法可以一次从文件中获取一行,而不是最终将整个文件加载到内存中.我想用attoparsec解析器在线上进行折叠.我尝试使用Data.Text.Lazy.IO,hGetLine这打击了我的记忆.我后来读到最终加载整个文件.

我使用也试过管道文本foldsview lines:

s <- Pipes.sum $ 
    folds (\i _ -> (i+1)) 0 id (view Text.lines (Text.fromHandle handle))
print s
Run Code Online (Sandbox Code Playgroud)

只计算行数,它似乎做了一些不稳定的东西"hGetChunk:无效的参数(无效的字节序列)",需要11分钟,wc -l需要1分钟.我听说管道文本可能有一些巨大的线条问题?(每行约1GB)

我对任何建议都很开放,除了新手readLine怎么样之外找不到多少搜索.

谢谢!

haskell haskell-pipes

6
推荐指数
1
解决办法
227
查看次数

切断懒惰列表生成

我想知道是否有人对如何制作一个能够获取列表的函数有任何见解,并且只返回可以在x时间内生成的术语.

例如,我有一个函数需要10分钟才能返回几个术语.我不想猜测我能生成多少个术语(使用x),我只想将无限列表输入到我的低效函数中,并有一个单独的函数来决定何时超时.

所以像这样: [5,7,10] = takeUntilTime (10 sec) . inefficientFunction $ [1..]

我对haskell很新,但我想我可以编写该函数来在每个新术语生成后检查计时器,如果时间已经过去就停止.

但是,如果第四个任期需要永恒呢?有没有办法阻止lowfficientFunction完成第四个任期的生成,即使它已经开始了?

我对一个直截了当的答案没有寄予厚望,但我对此表示赞赏.谢谢.

haskell functional-programming

5
推荐指数
2
解决办法
357
查看次数