小编Tik*_*vis的帖子

如何懒惰地在monad中构建Haskell列表?

考虑以下两个几乎相同的功能:

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中构建列表的好方法,还是有更有效的方法?

monads haskell

8
推荐指数
1
解决办法
189
查看次数

如果我知道它在运行时是真的,我如何告诉 GHC 满足类型级 <= 约束?

我有一个由自然数参数化的类型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)

haskell

8
推荐指数
1
解决办法
149
查看次数

如何在Float和[Word8]之间进行转换?

我想将Float转换为字节列表[Word8](反之亦然).我看到有一个Storable类可以用于此,但我想避免使用IO monad,因为这与IO无关.

haskell

7
推荐指数
2
解决办法
956
查看次数

在Javascript中,如何检查字符串是否只是字母+数字(允许下划线)?

我该如何检查?

我想允许所有A-Za-z0-9和下划线.任何其他符号,该函数应返回false.

javascript regex

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

Javascript - 转换颜色(数字 - >字符串)反之亦然

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? …

javascript rgb colors type-conversion

6
推荐指数
1
解决办法
5183
查看次数

Three.js - 释放记忆

我使用内置的形状挤出功能沿样条线挤出形状.每次移动样条曲线的节点时,我都会创建一个新的网格.但是这样我的RAM很快就满了.每次我创建一个新的网格我删除旧的网格

scene.__removeObject(mesh); 
Run Code Online (Sandbox Code Playgroud)

但它不会释放使用过的内存.我测试了Firefox Nightly和Chrome,如果内存已满,它们都会崩溃.

我搜索了一个通用的WebGL功能和Three.js相关的解决方案,但没有找到任何东西.

也许拥有更多WebGL/Three.js知识的人可以给我一个提示.谢谢

javascript webgl three.js

6
推荐指数
1
解决办法
1140
查看次数

如何在计算列表时输出值?

我有一个长时间运行的计算输出列表.我想在计算它们时输出此列表中的值.这样做的方法是什么?

目前我用来mapM_ print将每个值打印到STDOUT.这对于在命令行中打印值的简单情况来说效果很好,但感觉有点hacky并且难以使用.

此外,在某些时候,我想将命令行输出转换为交互式可视化.我怎么能把我的名单变成像FRP的一系列事件?能够将其作为事件源插入现有的GUI框架中会很棒.

重写函数以使用除列表之外的其他内容是一种选择,尽管允许我按原样获取列表的解决方案是理想的.

haskell frp

6
推荐指数
1
解决办法
160
查看次数

我应该如何用附加信息表示AST注释?

假设我有一种简单的数据类型,用某种语言表示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

6
推荐指数
1
解决办法
1025
查看次数

具有不同参数数量的函数的类型类

在我简单的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)

dsl haskell function typeclass

6
推荐指数
1
解决办法
418
查看次数

如何将这个二进制递归函数转换为尾递归形式?

对于在函数下关闭的集合,有一种明确的方法可以将二进制递归转换为尾递归,即为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)

binary-tree haskell functional-programming tail-recursion

5
推荐指数
1
解决办法
958
查看次数