小编Jay*_*Jay的帖子

Haskell中的怪癖7.8.3

我在普通文件中有2个函数,没有别的.

--This is FN1
helper :: Int -> Double -> Double
helper n x = (nu/d)
  where
    nu = x^n 
    d = product [1 .. n]

--This is FN2
filterOdd :: [a] -> [a] 
filterOdd ls = fi ls [1..]
  where
    fi [] _ = []
    fi (v:vs) (i:ix) = if even i
                        then v:(fi vs ix) 
                        else fi vs ix
Run Code Online (Sandbox Code Playgroud)

我正在使用GHC 7.8.3

我知道FN1中存在类型错误.我知道这一点.当注释并运行FN1时,GHCi不会抛出任何错误.但是当FN1被取消注释并且运行GHCi显示FN1中的明显错误时,FN2也会出现2页长的错误.

我不明白这一点.FN1和FN2之间没有明确的关系.FN1中没有任何内容正在调用FN2,反之亦然.但是,当FN1被取消注释时,为什么GHCi会显示FN2的错误?

确切的错误是足够长的,我决定把它放在lpaste上

有人可以告诉我,发生了什么事吗?很可能,我误解了一些事情.

haskell

14
推荐指数
1
解决办法
187
查看次数

缓冲区的名称只有文件名而不是路径

我正在使用vim-airline插件来改善vim会话底部的状态行.

在我的vimrc中,我有,

let g:airline#extensions#tabline#enabled = 1

这样做,它在每个缓冲区的顶部分配一个选项卡,该选项卡在该缓冲区中打开.

我的问题是,该选项卡中的文本具有在缓冲区中打开的文件的完整路径.而我只想要缓冲区选项卡中的文件名.

例如,如果我~/abcd/bcd/cd/d.txt在缓冲区中打开文件,那么相应缓冲区的选项卡有文本,~/a/b/c/d.txt而我希望它只是d.txt.

有人可以告诉我是否有办法实现这一目标?

vim

12
推荐指数
1
解决办法
2364
查看次数

群集遗传编程/算法

最近我一直试图了解hadoop集群是否可以用于遗传算法/编程工作.我一直在阅读有关hadoop的内容,我知道它可以平衡大型数据集的处理.在我的情况下,我不会有大型数据集..但我觉得非常有用的是hadoop的并行化功能.那么,我的问题是,像hadoop这样的程序是否可以用于评估或处理遗传算法/编程,我认为这些编程将更加面向处理,而不是面向I/O?

hadoop cluster-computing genetic-algorithm

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

使用FFI将'C'延迟函数导入Haskell

delay使用类型调用的wiringPi'C'库中有一个函数

void delay(unsigned int howLong);

此函数延迟执行代码howLong毫秒.我在haskell中编写了绑定代码,以便能够调用此函数.haskell代码如下,

foreign import ccall "wiringPi.h delay" c_delay :: CUInt -> IO ()
hdelay :: Int -> IO ()
hdelay howlong = c_delay (fromIntegral howlong)
Run Code Online (Sandbox Code Playgroud)

在此之后,我写了一个简单的haskell程序来调用这个函数.简单的haskell代码如下..

- 导入相关库后,我做了

main = wiringPiSetup
    >> delay 5000
Run Code Online (Sandbox Code Playgroud)

但延迟不会发生,或者ghc编译器生成的可执行文件会立即退出.

有人能告诉我这里可能出现什么问题吗?向正确的方向微调会有所帮助.

干杯和问候.

haskell ffi

5
推荐指数
1
解决办法
552
查看次数

如何模拟haskell状态?

我写了一些haskell代码来切换覆盆子pi上的一个引脚,这取决于我从raspberry pi上的另一个引脚获得的中断.我根本不知道如何在不知道之前的切换状态的情况下切换引脚的状态.该程序本身非常简单.

 import Control.Concurrent
 import Data.IORef
 import HasberryPi


 main = do wiringPiSetup
           pinMode 0 output
           pinMode 7 input 
           pullUpDnControl 7 pull_down
           wiringPiISR 7 edge_both onoff
           threadDelay (15*(10^6))

 onoff s = do a <- readIORef s                               -- This is wrong
              digitalWrite 0 (if b then pinhigh else pinlow) -- This is wrong
Run Code Online (Sandbox Code Playgroud)

所以基本上这里发生的是引脚7被注册为中断.只要引脚7从高电平变为低电平或从低电平变为高电平,就会触发中断.无论何时触发中断,它都会调用onoff切换引脚0状态的功能.

main功能是正确的.它的onoff功能就是问题.该onoff功能的所需特性是当引脚为低电平时将引脚0置为高电平,并在引脚为高电平时将引脚置为低电平.但要做到这一点,我需要在之前的调用中存储引脚的先前状态onoff.

我试过状态monad.但问题是状态monad基于初始状态值传递状态.但在随后的调用中onoff似乎无法改变初始状态值.我想到了IORef,它似乎没有什么不同.它似乎正在做状态正在做...但只在IO内部.

我可以清楚地看到,我非常缺乏在全局变量中存储状态的能力.而且我很高兴我无法做到这一点,因为我知道还有其他一些惯用的方法可以达到同样的目标.

非常感谢任何正确方向的帮助.

干杯和问候.

state haskell

5
推荐指数
1
解决办法
415
查看次数

Haskell Parsec遇到了麻烦

我正在尝试学习Parsec并尝试解析一个简单的电子邮件地址.我尝试了以下代码.我的预期输出是整个电子邮件地址作为字符串.但是当我运行代码时,我只能得到".com"可能会告诉我发生了什么事吗?

{-# LANGUAGE NoMonomorphismRestriction #-}

import Text.Parsec
import Control.Applicative hiding ((<|>))

email = many1 alphaNum
     *> char '@'
     *> many1 alphaNum
     *> string ".com"

emailstr = parse email "" "xxxx@yyy.com"
Run Code Online (Sandbox Code Playgroud)

haskell parsec

5
推荐指数
1
解决办法
423
查看次数

vim unite插件重新创建

我正在使用Vim和Unite插件.

我在我的vimrc文件中有一个键映射,如此,

nnoremap <Leader>t :Unite -start-insert file_rec<CR>

它按预期工作.唯一的问题是,当我在目录中创建一个新文件并尝试用t搜索时,新文件没有显示出来.我想我需要重新创建Unite用于快速搜索文件的索引.我甚至不确定Unite是否使用这样的索引.这只是我的猜测.

但有没有办法让Unite在搜索时显示新创建的文件?

vim vim-plugin unite.vim

5
推荐指数
1
解决办法
938
查看次数

Golang 反映包“不是一种类型”

我正在尝试学习接口以及如何编写一个函数来处理不同的类型。我想出了这个例子,我在一个切片int或一个切片中找到最大值float32。代码如下。我不断收到此错误“t 不是类型”。有人可以告诉我出了什么问题以及我如何解决它?

package main

import "fmt"
import "reflect"

var _ = fmt.Println
var _ = reflect.TypeOf

func maxer(s interface{}) interface{} {
    v := reflect.ValueOf(s)
    t := v.Type()

    maxval := s.(t)[0]
    for _, v := range s.(t)[1:] {
        if v > maxval {
            maxval = v
        }
    }
    return maxval
}

func main() {
    fmt.Println(maxer([]int{1, 2, 3, 4}))
    fmt.Println(maxer([]float32{1.1, 2.1, 3.14, 0.1, 2.4}))
Run Code Online (Sandbox Code Playgroud)

go

5
推荐指数
1
解决办法
6242
查看次数

Haskell parsec空间解析错误

我有

stringparse = mstring
          <$> char '"'
          <*> (many alphaNum <|> many space)
          <*> char '"'
    where mstring a b c = [a] ++ b ++ [c]
Run Code Online (Sandbox Code Playgroud)

当我做,

parse stringparse "" "\"hello\" 我明白了 Right "\"hello\""

当我做,

parse stringparse "" "\"\"" 我明白了 Right "\"\""

但是当我这样做的时候

parse stringparse "" "\" \"" 要么 parse stringparse "" "\"he llo\""

这是行不通的.

我收到错误,

Left (line 1, column 2):
unexpected " "
expecting letter or digit or "\""
Run Code Online (Sandbox Code Playgroud)

Left (line 1, column 4):
unexpected " " …
Run Code Online (Sandbox Code Playgroud)

haskell parsec

4
推荐指数
1
解决办法
226
查看次数

这两个非常相似的haskell状态计算之间的区别是什么

我正在努力学习haskell State monad.所以我写了一个函数来使用State monad生成一个随机数列表.

这是第一个版本.

rnds :: Int -> [Int]
rnds n = evalState (help (mkStdGen 007)) []
  where help prng = do s <- get
            let (a, nprng) = randomR (1,6) prng                                 
            put (a:s)
            if length s == n then (return s)
                             else (help nprng)
Run Code Online (Sandbox Code Playgroud)

这是第二个版本.

rnds1 :: Int -> [Int]
rnds1 n = evalState (help (mkStdGen 007)) []
  where help prng = do s <- get
            let (a, nprng) = randomR (1,6) prng                                 
            put (a:s)
            ns <- get …
Run Code Online (Sandbox Code Playgroud)

state haskell

3
推荐指数
1
解决办法
147
查看次数