我一直在努力弄清楚TED Talk主页是如何工作的.撇开所有的动画垃圾,我发现盒子组织的方式真的很吸引人.
乍一看,它看起来像jQuery砌体插件,很快就会发现它倾向于创建几个直角三角形形状,但没有固定数量的列或行,并且产生的最终形状总是完全坚固(没有空心部件) ).
我最初的假设是,盒子(它们的大小是由网站上的某个因素预先确定的)是随机排序的,然后使用一些简单的规则顺序添加到网格中,但是我无法确定这些规则可能是什么,或者它们如何可以防止最终形状的任何凹陷.
有谁知道这是如何工作的?
我编写了以下程序来检查平衡括号的字符串:
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
我有一个函数,它从树中递归地创建一个扁平的矩阵列表,这些矩阵必须是可变的,因为它们的元素在创建过程中经常更新.到目前为止,我已经提出了一个具有签名的递归解决方案:
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关键字的含义)以及如何评估列表中的数组?
我是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)
我有编程经验,但这是我第一次接近函数式编程,所以任何帮助都将受到赞赏.
我正在寻找一个能够执行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可以做到这一点)
我能够完美地执行以下代码
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的初学者,错误信息对我来说太过希腊语和拉丁语.根据我的理解,编译器无法在第二种情况下推断出类型.有人能指出我到底发生了什么吗?
我试图在哈斯克尔去做一个do语句.我在这里找到了一些例子但是不能将它们应用到我的案例中.我唯一能想到的是一个沉重的嵌套let语句,看起来很难看.
应该用bind替换表示法的语句:
do num <- numberNode x
nt1 <- numberTree t1
nt2 <- numberTree t2
return (Node num nt1 nt2)
Run Code Online (Sandbox Code Playgroud)
任何输入都高度赞赏=)
我在共享的Web服务器上,我在本地安装了apache2,所以我可以按照我需要的任何方式进行设置.部署yesod应用程序最受支持的方式是什么?我可以将我的apache2设置为Warp的代理.这是最好的设置吗?或者我应该选择FastCGI?
我也很欣赏有关如何设置所有内容的详细信息.我的意思是如何写一个请求处理程序,如果我需要一个,什么apache的VirtualHost应该是什么样的,等等,因为我是yesod的新手.
我正在GHCi做一些实验,我正在尝试调整中等长时间(5分钟)的操作.结果开始中途打印,我经常可以告诉我的算法在1分钟或更短的时间后没有正确调整,所以我取消了操作.但是当我找到结果时,我想让它继续到最后,然后再使用它.但是,如果我在启动时分配它,我就无法看到它的处理过程.有什么方法可以访问输入GHCi的前一个表达式的结果吗?
如果像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来解决这个值,因为我们只能给每个函数一个参数.我们需要至少有两个为继续和"实际"论证腾出空间.
还是我完全错过了什么?