考虑以下两个几乎相同的功能:
buildList 0 = []
buildList n = n : buildList (n - 1)
buildListM 0 = return []
buildListM n = buildListM (n - 1) >>= return . (n :)
Run Code Online (Sandbox Code Playgroud)
Haskell的懒惰方面允许buildList在内存中生成列表而没有太多开销,因为它生成列表的头部然后构建尾部.
但monadic版本buildListM似乎使用更多的内存,n因为它必须首先构建尾部然后在头部前面.
这是在monad中构建列表的好方法,还是有更有效的方法?
我有一个由自然数参数化的类型n:
data MyType (n :: Nat) = MyType
Run Code Online (Sandbox Code Playgroud)
对这种类型的操作仅在 时才有意义n > 0,因此我将其指定为约束:
myFunction :: (KnownNat n, 1 <= n) => MyType n -> MyType n
myFunction = id
Run Code Online (Sandbox Code Playgroud)
(请注意,这些功能的真正的版本做用n将其变成一个值natVal。)
我想创建一个存在类型 ( SomeMyType),让我们n在运行时选择一个:
data SomeMyType where
SomeMyType :: forall n. (KnownNat n, 1 <= n) => MyType n -> SomeMyType
Run Code Online (Sandbox Code Playgroud)
为了产生 的值SomeMyType,我正在编写一个someMyTypeVal函数,其工作方式如下someNatVal:
someMyTypeVal :: Integer -> Maybe SomeMyType
someMyTypeVal n
| n …Run Code Online (Sandbox Code Playgroud) 我想将Float转换为字节列表[Word8](反之亦然).我看到有一个Storable类可以用于此,但我想避免使用IO monad,因为这与IO无关.
我该如何检查?
我想允许所有A-Za-z0-9和下划线.任何其他符号,该函数应返回false.
utils.parseColor = function (color, toNumber) {
if (toNumber === true) {
if (typeof color === 'number') {
return (color | 0); //chop off decimal
}
if (typeof color === 'string' && color[0] === '#') {
color = color.slice(1);
}
return window.parseInt(color, 16);
} else {
if (typeof color === 'number') {
//make sure our hexadecimal number is padded out
color = '#' + ('00000' + (color | 0).toString(16)).substr(-6);
}
return color;
}
};
Run Code Online (Sandbox Code Playgroud)
嘿伙计们,我遇到这段代码.它是JavaScript中的实用程序函数,可以在数字和字符串之间来回转换颜色.有两部分我不太确定,
首先,什么return (color|0);意思?什么是|?在JavaScript? …
我使用内置的形状挤出功能沿样条线挤出形状.每次移动样条曲线的节点时,我都会创建一个新的网格.但是这样我的RAM很快就满了.每次我创建一个新的网格我删除旧的网格
scene.__removeObject(mesh);
Run Code Online (Sandbox Code Playgroud)
但它不会释放使用过的内存.我测试了Firefox Nightly和Chrome,如果内存已满,它们都会崩溃.
我搜索了一个通用的WebGL功能和Three.js相关的解决方案,但没有找到任何东西.
也许拥有更多WebGL/Three.js知识的人可以给我一个提示.谢谢
我有一个长时间运行的计算输出列表.我想在计算它们时输出此列表中的值.这样做的方法是什么?
目前我用来mapM_ print将每个值打印到STDOUT.这对于在命令行中打印值的简单情况来说效果很好,但感觉有点hacky并且难以使用.
此外,在某些时候,我想将命令行输出转换为交互式可视化.我怎么能把我的名单变成像FRP的一系列事件?能够将其作为事件源插入现有的GUI框架中会很棒.
重写函数以使用除列表之外的其他内容是一种选择,尽管允许我按原样获取列表的解决方案是理想的.
假设我有一种简单的数据类型,用某种语言表示AST:
data Term = Var String
| Num Integer
| Expr [Term]
Run Code Online (Sandbox Code Playgroud)
(实际上它显然会有比这更多的构造函数.)
我可以用它来编写一个与AST结构匹配的简单评估函数:
eval :: Term -> Result
eval (Var name) = lookup name
eval (Num n) = return n
eval (Expr exprs) = ...
Run Code Online (Sandbox Code Playgroud)
我可以使用行号等信息对AST进行注释,而无需更改模式匹配的工作方式吗?
(如果我不介意更改模式,我当然可以使用记录语法或视图模式.)
在我简单的Haskell DSL中,我有以下函数来调用其他函数:
callF :: forall a. (Typeable a)
=> (V a) -> (V a)
callF fp@(V (FunP name)) =
pack $ FunAppl (prettyV fp) []
callF1 :: forall a b. (Typeable a, Typeable b)
=> (V (V a -> V b)) -> V a -> (V b)
callF1 fp@(V (FunP name)) arg =
pack $ FunAppl (prettyV fp) [prettyV arg]
callF2 :: forall a b c. (Typeable a, Typeable b, Typeable c)
=> (V (V a -> V b -> …Run Code Online (Sandbox Code Playgroud) 对于在函数下关闭的集合,有一种明确的方法可以将二进制递归转换为尾递归,即为Fibonacci序列添加整数:
(使用Haskell)
fib :: Int -> Int
fib n = fib' 0 1 n
fib' :: Int -> Int -> Int
fib' x y n
| n < 1 = y
| otherwise = fib' y (x + y) (n - 1)
Run Code Online (Sandbox Code Playgroud)
这工作,因为我们有我们的期望值y,而我们的操作,x + y其中x + y返回一个整数,就像y做.
但是,如果我想使用未在函数下关闭的集合,该怎么办?我想采用一个将列表拆分为两个列表的函数,然后对这两个列表执行相同的操作(例如递归创建二叉树),当另一个函数神奇地说明何时停止查看结果分割时,我停止:
[1, 2, 3, 4, 5] -> [[1, 3, 4], [2, 5]] -> [[1, 3], [4], [2], [5]]
Run Code Online (Sandbox Code Playgroud)
那是,
splitList :: [Int] -> [[Int]]
splitList …Run Code Online (Sandbox Code Playgroud)