我有一个Web服务的想法,但我对Web编程很新.Django看起来很棒,喜欢我可以快速拿起的东西.我在Haskell方面有很多经验(在python中很少),并希望能够用我最喜欢的语言开始编写一些后端非网络相关的东西.但是,如果我使用django,如果haskell代码不可用,我当然不想这样做.
我一直在看几个haskell web框架:hApps看起来太复杂和没有文档,turbinado看起来平易近人但没有文档等等.我认为使用广泛使用的框架,如django,并且可以访问大量代码,我可以插上电话对我很有帮助.但我非常愿意听到有关框架使用的其他想法,或者我必须以某种方式使用Haskell的其他选项.
我在ghc-users邮件列表上问了这个问题并得到了一些有用的回复,但仍然不明白这段代码中发生了什么.
本质上我试图理解如何捕获异常BlockedIndefinitelyOnMVar来恢复可能尚未返回的锁,并通常理解此异常.
以下是一些单线程代码:
-- This raises the exception only once and the lock is successfully restored:
main1 = do
lock <- newMVar ()
lockPrint "good1" lock
takeMVar lock
putStrLn "main: took lock but didn't return it!"
-- exception is raised and lock is restored here:
lockPrint "good2" lock
-- no exception raised:
lockPrint "good3" lock
readMVar lock
putStrLn "great success"
lockPrint :: String -> MVar () -> IO ()
lockPrint name v = takePrint `finally` put
where put …Run Code Online (Sandbox Code Playgroud) 我使用wl-pprint包,因为标准的 PrettyPrinter 缺乏功能。一切都很好,除了vcat函数中的空文档(与<$>组合器相同)。
正确行为:
import Text.PrettyPrint
> vcat[text "a", empty, text "b"]
a
b
Run Code Online (Sandbox Code Playgroud)
wl-pprint 显示一个额外的空行:
import Text.PrettyPrint.Leijen
> vcat[text "a", empty, text "b"]
a
b
Run Code Online (Sandbox Code Playgroud)
那我能做什么?这是IMPOSIBLE进行筛选VCAT列表中,因为没有Eq为实例Doc。
我想在库中做一些魔术,允许产品类型被多态地破坏.这是一个或多或少的工作模型,说明了我想做的事情:
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, UndecidableInstances #-}
newtype Wrapped a = Wrapped { unwrap :: a }
-- our example structure
ex :: (Int, (Int, Int))
ex = (1,(2,3))
class WrapDecomp x y | y -> x where
decomp :: x -> y
instance (WrapDecomp x x', WrapDecomp y y')=> WrapDecomp (x,y) (x',y') where
decomp (x,y) = (decomp x, decomp y)
instance WrapDecomp x (Wrapped x) where
decomp = Wrapped
example = let w = decomp ex
(w0, w1) …Run Code Online (Sandbox Code Playgroud) 我的项目有一个标准的存储库
/home/repo/.git
Run Code Online (Sandbox Code Playgroud)
这是我克隆的存储库,以获取新网站的基本代码,即我克隆了这个
/var/www/site1
Run Code Online (Sandbox Code Playgroud)
我也有几个模块,我作为存储库创建,一些网站将使用这些模块,一些不会.
/home/modules/mod1/.git
/home/modules/mod2/.git
Run Code Online (Sandbox Code Playgroud)
有没有办法可以将这些模块克隆到同一个站点文件夹中?
/var/www/site1
Run Code Online (Sandbox Code Playgroud)
模块目录设置与主仓库具有相同的文件夹结构,当我在主仓库克隆顶部克隆它们时,它们应合并/替换现有文件.(很少有文件重叠)
我的最佳解决方案是以某种方式命名repo,以便在部署新站点时我执行以下操作:
cd /var/www/newsite
git clone /home/repo/.git
git clone /home/modules/mod1/.git
git clone /home/moudles/mod2/.git
Run Code Online (Sandbox Code Playgroud)
当我有更新到网站,我可以做一个像拉:
git pull origin master
git pull mod1
git pull mod2
Run Code Online (Sandbox Code Playgroud)
或者最好:
git pull origin master
Run Code Online (Sandbox Code Playgroud)
也会称之为拉动mod1和mod2.
我一直在看git子模块和分支,但无法弄清楚它们是否是我需要的.
我发现--avoid-reinstallsmake包构建在cabal失败的地方.到底是做什么的?不是cabal已经试图避免重新安装,或者不应该吗?
我一直在研究使用Haskell的抽象国际象棋算法(试图扩展我对不同范式的理解),并且我遇到了一个我一直在思考几周的挑战.
这是问题所在:
给定一个板(由整数列表表示;每个整数代表一个后续点值),维度为nxn,确定提供最多点的路径.如果最佳路径存在平局,则返回其中任何一个.
以下是具体内容:
A = [[5,4,3,1],[10,2,1,0],[0,1,2,0],[2,3,4,20]]
Run Code Online (Sandbox Code Playgroud)
其呈现为:
R1: 5 4 3 1, R2: 10 2 1 0, R3: 0 1 2 0, R4: 2 3 4 20.
Run Code Online (Sandbox Code Playgroud)
规则是:
你可以从最上面的任何地方开始
您可以一次移动一个方格,可以是直下,左下(对角线)或右下(对角线).
输出必须是整数元组.
第一个元素是表示列与行的列表,第二个元素是总点数.例如.对于上面的板,最好的解决方案是从左上角(5)行进并沿对角线行进剩余的步骤(直到20点方形).这将导致元组([1,2,3,4], 29).
记住,这一切都在Haskell中,因此它是一个功能范式的递归问题.起初,我正在考虑使用贪婪算法,即选择r1中的最高值,并通过比较接下来的3种可能性进行递归; 选择3中的最高值.然而,垮台是贪婪算法无法在下一行之前看到潜力.
我该怎么做?我不是在寻找代码本身,因为我喜欢自己解决问题.但是,非常感谢伪代码或一些算法指导!
我正在做一些并发和内存可见性的实验,并遇到了这种奇怪的行为(请参阅注释内联):
module Main
where
import Data.IORef
import Control.Concurrent
import System.CPUTime
import System.IO
main = do
hSetBuffering stdout NoBuffering
r <- newIORef False
putStrLn "forking..." -- PRINTED
forkIO $ f r
threadDelay 1000000
putStrLn "writeIORef" -- NEVER PRINTED
writeIORef r True
threadDelay maxBound
f :: IORef Bool -> IO ()
f r = readIORef r >>= \b-> if b then print "NEVER PRINTED" else f r
Run Code Online (Sandbox Code Playgroud)
我希望writeIORef孩子线程可能看不到,但主线程不能简单地(显然)停止.
编译于ghc 7.8.3
cabal exec ghc -- --make -fforce-recomp -O2 -threaded visibility.hs
Run Code Online (Sandbox Code Playgroud)
并运行 …
我正在Word从字节数组中读取s并且需要使我的代码的一部分以字节序识别.GHC是否暴露了任何MachDeps.h可以用于使代码以处理器字节顺序为条件的代码?如果没有,我可以可靠地推断出HOST_ARCH(通过ghcplatform.h带arch()条件的.cabal文件中的可访问性)吗?还是其他想法?
我开始学习 Haskell,我发现ghc可以使用带有标志的 LLVM 进行编译-fllvm。每当我使用该标志时,我都会收到错误消息:
<no location info>: error:
Warning: Couldn't figure out LLVM version!
Make sure you have installed LLVM 3.7
ghc: could not execute: opt
Run Code Online (Sandbox Code Playgroud)
不过,我opt的文件夹里有/usr/local/Cellar/llvm/3.9.0/。我使用的是 Mac OS X,并且已经安装了完整的 LLVM,brew install llvm但错误仍然存在。这是一个真正的版本问题吗?我必须卸载 LLVM 并重新安装其 3.7 版本?或者在ghc查找时遇到问题opt,并且我可以修改某种搜索路径来解决问题?感谢您的帮助,祝您有美好的一天。
haskell ×9
ghc ×5
cabal ×2
concurrency ×2
algorithm ×1
django ×1
endianness ×1
git ×1
greedy ×1
ioref ×1
llvm ×1
macos ×1
optimization ×1
pretty-print ×1
recursion ×1
types ×1