小编asm*_*asm的帖子

SICP练习中的Haskell数值类型层次结构

我最近一直在学习Haskell,正在和一位正在通过SICP工作的朋友交谈.我们很想比较Common Lisp和Scheme,所以我决定尝试将练习1.29翻译成Haskell.

本练习使用函数sigma,它表示数学求和函数Sigma.此函数采用函数f应用于每个术语,下限,应用于每个术语以获得下一个术语的函数和上限.它返回应用于每个术语的f的总和.

simpsonIntegral应该使用Simpson规则使用"准确度"n来近似函数f在[a,b]范围内的积分.我无法使这个功能起作用,因为似乎有些东西我不了解所涉及的类型.

这段代码将使用ghc的6.12.1版进行编译,但simpsonIntegral将被赋予一个类型上下文(Integral a,Fractional a),它没有任何意义,只要你调用它就会爆炸.我有一点工作,但我所做的显然是一个黑客,我想在这里询问如何处理这个问题.

如何习惯性地处理h中所需的积分 - >分数/实数转换?我读了很多东西,但似乎没有什么是明显和干净的.

sigma :: (Ord a, Num b) => (a -> b) -> a -> (a -> a) -> a -> b
sigma f a next b = iter a 0
  where
    iter current acc | current > b = acc
                     | otherwise = iter (next current) (acc + f current)

simpsonIntegral f a b n = 1.0 * (h / 3) * (sigma simTerm 0 (1+) n)
  where
    h = (b …
Run Code Online (Sandbox Code Playgroud)

haskell types type-conversion

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

QSem似乎没有阻止线程

我正在编写一个简单的脚本来使用Shelly库并行运行大量任务,但我想限制任何时候运行的最大任务数.该脚本在每行上获取一个带有输入的文件,并为该输入运行任务.文件中有几百个输入,我想一次限制到大约16个进程.

当前脚本实际上使用初始计数为1的QSem限制为1(很好地尝试).我似乎错过了一些东西,因为当我运行带有4个输入的测试文件时,我看到:

Starting
Starting
Starting
Starting
Done
Done
Done
Done

所以线程没有像我预期的那样在QSem上阻塞,它们都是同时运行的.我甚至已经实现了我自己的信号量MVar,TVar并且都没有像我预期的那样工作.我显然缺少一些基本的但是什么?我也尝试编译代码并将其作为二进制文件运行.

#!/usr/bin/env runhaskell
{-# LANGUAGE TemplateHaskell, QuasiQuotes, DeriveDataTypeable, OverloadedStrings #-}

import Shelly
import Prelude hiding (FilePath)
import Text.Shakespeare.Text (lt)
import qualified Data.Text.Lazy as LT
import Control.Monad (forM)
import System.Environment (getArgs)

import qualified Control.Concurrent.QSem as QSem
import Control.Concurrent (forkIO, MVar, putMVar, newEmptyMVar, takeMVar)

-- Define max number of simultaneous processes
maxProcesses :: IO QSem.QSem
maxProcesses = QSem.newQSem 1

bkGrnd :: ShIO a -> ShIO (MVar …

haskell semaphore shelly

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

vim EasyTags,每个文件类型标签命令?

我使用优秀的EasyTags插件与vim.我唯一的问题是Exuberant CTags不支持Haskell.但是,有几个程序可以正确生成Haskell vim标记文件,我已经在EasyTags中使用了每个文件类型标记文件选项.

有没有办法告诉EasyTags在每种文件类型的基础上使用不同的ctags程序?我可以编写一个包装脚本并将其设置为全局ctags程序,但更喜欢更清洁的解决方案.

我试过了

:autocmd FileType haskell let g:easytags_cmd = '~/.cabal/bin/lushtags'
Run Code Online (Sandbox Code Playgroud)

但EasyTags似乎试图在ctags程序中查询支持的语言列表,因此当我打开启用了此选项的Haskell文件时,我收到错误.

"Data/Csv/Conduit.hs" [RO] 51L, 1950C
Error detected while processing function xolox#easytags#register..xolox#easytags#get_tagsfi
le..xolox#easytags#supported_filetypes..34_check_filetype:
line    3:
E605: Exception not caught: Failed to get supported languages! (output: Usage: lushtags [op
tions] [--] )
Error detected while processing function xolox#easytags#register..xolox#easytags#get_tagsfi
le..xolox#easytags#supported_filetypes:
line   14:
E171: Missing :endif
Error detected while processing function xolox#easytags#register..xolox#easytags#get_tagsfi
Run Code Online (Sandbox Code Playgroud)

tags vim exuberant-ctags

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

安全地将“float”转换为“double”而不会损失精度

我有以下令人头疼的问题,在此处jshell 11.0.1217.0.1此处进行了演示

\n
jshell> 13.9f\n$1 ==> 13.9\n\njshell> 13.9\n$2 ==> 13.9\n\njshell> (double) 13.9f\n$3 ==> 13.899999618530273\n
Run Code Online (Sandbox Code Playgroud)\n

两个版本的简单编译类中都会发生同样的事情

\n
jshell> 13.9f\n$1 ==> 13.9\n\njshell> 13.9\n$2 ==> 13.9\n\njshell> (double) 13.9f\n$3 ==> 13.899999618530273\n
Run Code Online (Sandbox Code Playgroud)\n
\xe2\x95\xb0\xe2\x94\x80\xe2\x9e\xa4  java Test      \n13.899999618530273\n13.9\n
Run Code Online (Sandbox Code Playgroud)\n

尽管 17 警告strictfp不再需要

\n
warning: [strictfp] as of release 17, all floating-point expressions are evaluated strictly and \'strictfp\' is not required\n
Run Code Online (Sandbox Code Playgroud)\n

JLS在第 5.1.2 节中对此进行了说明

\n
A widening primitive conversion does not lose information about the overall\nmagnitude of a …
Run Code Online (Sandbox Code Playgroud)

java floating-point precision

2
推荐指数
1
解决办法
571
查看次数