小编ham*_*mar的帖子

TED Talk主页如何组织视频网格?

我一直在努力弄清楚TED Talk主页是如何工作的.撇开所有的动画垃圾,我发现盒子组织的方式真的很吸引人.

乍一看,它看起来像jQuery砌体插件,很快就会发现它倾向于创建几个直角三角形形状,但没有固定数量的列或行,并且产生的最终形状总是完全坚固(没有空心部件) ).

我最初的假设是,盒子(它们的大小是由网站上的某个因素预先确定的)是随机排序的,然后使用一些简单的规则顺序添加到网格中,但是我无法确定这些规则可能是什么,或者它们如何可以防止最终形状的任何凹陷.

有谁知道这是如何工作的?

algorithm grid-layout

11
推荐指数
1
解决办法
1430
查看次数

检查字符串是否包含平衡括号

我编写了以下程序来检查平衡括号的字符串:

isBalanced xs = isBalanced' xs []

isBalanced' [] [] = True
isBalanced' [] _  = False

isBalanced' ('(':xs) ys = isBalanced' xs (')':ys)
isBalanced' ('[':xs) ys = isBalanced' xs (']':ys)
isBalanced' ('{':xs) ys = isBalanced' xs ('}':ys)

isBalanced' _  [] = False

isBalanced' (x:xs) (y:ys) = (x == y) && (isBalanced' xs ys)
Run Code Online (Sandbox Code Playgroud)

以下是一些示例数据:

positives = [
    isBalanced "",
    isBalanced "()",
    isBalanced "[]",
    isBalanced "{}",
    isBalanced "([]){}[{}]"
    ]

negatives = [
    isBalanced "(",
    isBalanced "[",
    isBalanced "{",
    isBalanced ")", …
Run Code Online (Sandbox Code Playgroud)

recursion haskell pattern-matching pushdown-automaton formal-languages

11
推荐指数
2
解决办法
3429
查看次数

在一个STArrays列表上映射runSTArray?

我有一个函数,它从树中递归地创建一个扁平的矩阵列表,这些矩阵必须是可变的,因为它们的元素在创建过程中经常更新.到目前为止,我已经提出了一个具有签名的递归解决方案:

doAll :: .. -> [ST s (STArray s (Int, Int) Int)]
Run Code Online (Sandbox Code Playgroud)

我不[UArray (Int,Int) Int]直接返回的原因是因为doAll递归调用,修改列表中矩阵的元素并附加新矩阵.我不想不必要地冻结和解冻基质.

到现在为止还挺好.我可以检查n-th矩阵(类型Array (Int, Int) Int)ghci

runSTArray (matrices !! 0)
runSTArray (matrices !! 1)
Run Code Online (Sandbox Code Playgroud)

事实上,我的算法得到了正确的结果.但是,我没有找到一种方法来映射runSTUArray返回的列表doAll:

map (runSTArray) matrices

Couldn't match expected type `forall s. ST s (STArray s i0 e0)'
            with actual type `ST s0 (STArray s0 (Int, Int) Int)'
Run Code Online (Sandbox Code Playgroud)

如果我尝试在列表上递归计算或尝试评估函数中包含的单个元素,则会出现同样的问题

有人可以解释一下发生了什么(我真的不明白forall关键字的含义)以及如何评估列表中的数组?

arrays state haskell higher-rank-types

11
推荐指数
1
解决办法
409
查看次数

Haskell打印线功能

我是Haskell的新手,我想知道是否有办法在Haskell中的函数中输出'debug'行?IE我想调试输入函数的值

我目前的代码是

import Prelude

foo(a,b,c) 
    print("input a : " ++ a)
    = a + b + c

main = print(foo(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)

我有编程经验,但这是我第一次接近函数式编程,所以任何帮助都将受到赞赏.

haskell functional-programming

11
推荐指数
2
解决办法
4320
查看次数

Haskell:获取表达式的静态类型

我正在寻找一个能够执行GHCi:type命令的功能.

理想情况下,它会有类似的签名

getStaticType :: a -> String

a = getStaticType (1+2)
-- a = "(Num t) => t"

b = getStaticType zipWith
-- b = "(a -> b -> c) -> [a] -> [b] -> [c]"
Run Code Online (Sandbox Code Playgroud)

(注意:这与Data.Dynamic无关.我只想从编译器推断出静态类型.实际上该函数根本不需要运行时实现,因为对它的所有调用都可以在编译时作为常量内联时间.我假设它存在于某处,因为GHCi可以做到这一点)

haskell types ghc

11
推荐指数
1
解决办法
2428
查看次数

无法将预期类型"a"与实际类型"[a]"匹配

我能够完美地执行以下代码

myLast :: [a] -> a
myLast [] = error "Can't call myLast on an empty list!"
myLast (x:_) = x
Run Code Online (Sandbox Code Playgroud)

但是我收到Couldn't match expected type `a' with actual type `[a]'. `a' is a rigid type variable bound by the type signature for myLast :: [a] -> a以下代码的错误:

myLast :: [a] -> a
myLast [] = error "Can't call myLast on an empty list!"
myLast (_:x) = x
Run Code Online (Sandbox Code Playgroud)

我是Haskell的初学者,错误信息对我来说太过希腊语和拉丁语.根据我的理解,编译器无法在第二种情况下推断出类型.有人能指出我到底发生了什么吗?

haskell

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

Haskell用符号绑定

我试图在哈斯克尔去做一个do语句.我在这里找到了一些例子但是不能将它们应用到我的案例中.我唯一能想到的是一个沉重的嵌套let语句,看起来很难看.

应该用bind替换表示法的语句:

do num <- numberNode x
   nt1 <- numberTree t1
   nt2 <- numberTree t2
   return (Node num nt1 nt2)
Run Code Online (Sandbox Code Playgroud)

任何输入都高度赞赏=)

haskell do-notation

11
推荐指数
2
解决办法
998
查看次数

部署Yesod的推荐方法是什么?

我在共享的Web服务器上,我在本地安装了apache2,所以我可以按照我需要的任何方式进行设置.部署yesod应用程序最受支持的方式是什么?我可以将我的apache2设置为Warp的代理.这是最好的设置吗?或者我应该选择FastCGI?

我也很欣赏有关如何设置所有内容的详细信息.我的意思是如何写一个请求处理程序,如果我需要一个,什么apache的VirtualHost应该是什么样的,等等,因为我是yesod的新手.

yesod

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

在GHCi中,我可以使用前一个表达式的结果吗?

我正在GHCi做一些实验,我正在尝试调整中等长时间(5分钟)的操作.结果开始中途打印,我经常可以告诉我的算法在1分钟或更短的时间后没有正确调整,所以我取消了操作.但是当我找到结果时,我想让它继续到最后,然后再使用它.但是,如果我在启动时分配它,我就无法看到它的处理过程.有什么方法可以访问输入GHCi的前一个表达式的结果吗?

haskell ghci

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

CPS用咖喱语言

如果像lambda演算或Ocaml这样的curry语言中的CPS如何有意义?从技术上讲,所有函数都有一个参数.所以说我们在一种语言中添加了CPS版本:

cps-add k n m = k ((+) n m)
Run Code Online (Sandbox Code Playgroud)

我们称之为

(cps-add random-continuation 1 2)
Run Code Online (Sandbox Code Playgroud)

这与以下相同:

(((cps-add random-continuation) 1) 2)
Run Code Online (Sandbox Code Playgroud)

我已经看到两个调用不是尾调用,实际上是一个复杂的嵌套表达式,(cps-add random-continuation)返回一个值,即一个消耗数字的函数,然后返回一个消耗另一个数字的函数,然后将两者的总和传递给那个random-continuation.但是我们不能通过简单地将它转换为CPS来解决这个值,因为我们只能给每个函数一个参数.我们需要至少有两个为继续和"实际"论证腾出空间.

还是我完全错过了什么?

continuations ocaml haskell currying continuation-passing

9
推荐指数
2
解决办法
1181
查看次数