小编luo*_*990的帖子

在Haskell中计算N-Ary(具有不同类型!!)笛卡尔积

我知道该函数sequence可以处理[[1, 2], [3, 4]] -> [[1, 3], [1, 4], [2, 3], [2, 4]]问题.

但我认为真正的笛卡尔积应该处理这个([1, 2], ['a', 'b']) -> [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]问题,如果每个列表的类型不同,外部元组的类型(和大小)也应该关心.

所以,cartProd我想要的函数有这样的类型:([a1], [a2], [a3] ...) -> [(a1, a2, a3 ...)]

我知道类型系统存在一些问题.但有没有办法实现这个完美版本cartProd

haskell template-haskell

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

为什么要提供“ HasCallStack”机制,因为我们在GHC中已经有“ ghc -prof -fprof-auto-top”?

AFAIK,有两种方法可以获取调用堆栈以在Haskell中进行调试:

  1. HasCallStack在代码中添加约束
  2. 用编译代码 ghc -prof -fprof-auto-top

我的测试代码:

import GHC.Stack

-- | a wrapper function to make "last" from base traceable
last' :: HasCallStack => [a] -> a
last' xs = case xs of [] -> error "abuse last"; _ -> last xs

-- | a untraceable partial function
foo :: [Int] -> Int
foo xs = last' xs + 1

-- | a untraceable partial function
-- , which looks like traceable, but it's call stack is cut off …
Run Code Online (Sandbox Code Playgroud)

callstack haskell ghc

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

是否可以像 NPM(NodeJS)一样设计 Stack(Haskell)?

哈斯克尔工具集是目前最流行的Haskell包管理器,现在,它的主要目标是使大厦哈斯凯尔包重复性。

但是堆栈方法的目标是找到一个巨大的无冲突包修订集,并将其称为snapshot. 通过这种方式,包维护者被推送更新他的包的依赖项,这样它就不会与最近的snapshot.

我不得不说,这个设计太理想了,无法在现实世界中工作。

相比之下,NPM(NodeJS 的包管理器)通过一种更实用的方式来实现这个目标:它允许冗余。在钻石依赖的情况下,例如a -> b, c; b -> d(v1); c -> d(v2),NPM 只需db和分别安装两个不同的版本c。这样,使用包的用户就可以像黑盒一样依赖包,无需考虑依赖之间是否存在冲突的深度依赖。

我想知道为什么 Stack 的设计不允许对包进行冗余修订是否有一些实际的原因。是否可以为 Haskell 实现这样的包管理器?它的实施中最困难的部分是什么?

haskell package-managers haskell-stack

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

为什么 Impala 扫描节点非常慢(RowBatchQueueGetWaitTime)?

该查询大多数情况下会在 10 秒内返回,但有时需要 40 秒或更长时间。

swarm中有两个执行器节点,两个节点的配置文件没有显着差异,以下是其中之一:

      HDFS_SCAN_NODE (id=0):(Total: 39s818ms, non-child: 39s818ms, % non-child: 100.00%)
     - AverageHdfsReadThreadConcurrency: 0.07 
     - AverageScannerThreadConcurrency: 1.47 
     - BytesRead: 563.73 MB (591111366)
     - BytesReadDataNodeCache: 0
     - BytesReadLocal: 0
     - BytesReadRemoteUnexpected: 0
     - BytesReadShortCircuit: 0
     - CachedFileHandlesHitCount: 0 (0)
     - CachedFileHandlesMissCount: 560 (560)
     - CollectionItemsRead: 0 (0)
     - DecompressionTime: 1s501ms
     - MaterializeTupleTime(*): 11s685ms
     - MaxCompressedTextFileLength: 0
     - NumColumns: 9 (9)
     - NumDictFilteredRowGroups: 0 (0)
     - NumDisksAccessed: 1 (1)
     - NumRowGroups: 56 (56)
     - NumScannerThreadMemUnavailable: 0 (0)
     - NumScannerThreadReservationsDenied: …
Run Code Online (Sandbox Code Playgroud)

olap hadoop hdfs impala

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

为什么我们不能在Coq/Agda/Idris的Set/Type上进行模式匹配?

考虑一个接受Set的函数,并返回其字节长度,命名为byteLength:

byteLength : Set -> Maybe Nat
Run Code Online (Sandbox Code Playgroud)

如果我想直接实现这个函数,我需要在类型参数上进行模式匹配:

byteLength Char = Just 1
byteLength Double = Just 8
byteLength _ = Nothing
Run Code Online (Sandbox Code Playgroud)

但由于不允许在Set/Type上进行模式匹配,因此上述代码无法编译.

所以我们必须将接口定义为变通方法

Interface ByteLength a where
    byteLength : Nat

implement ByteLength Char where
    byteLength = 1
Run Code Online (Sandbox Code Playgroud)

并且以更一般的方式,也许我们可以使用TypeRep之类的东西在TypeRep上执行类似的事情和模式匹配.但TypeRep也被定义为接口.

我认为使用Interface和使用forall是非常不同的,因为Interface意味着"对于某些类型",而forall意味着"适用于所有类型".

我想知道为什么这些DT语言不支持Set/Type上的模式匹配,是否有一些我不知道的特殊原因?

coq agda idris

4
推荐指数
1
解决办法
255
查看次数

为什么“同时”在Haskell中不是单子?

我在读包的文档异步,并试图找到类似于JavaScript的承诺的东西,我觉得Concurrently,这是最贴近的概念,实现FunctorApplicative(Promise.all),Alternative(Promise.race)。但是它没有实现Monad(Promise.then),我想知道为什么。

我认为这可能是因为(>>=)是顺序操作,与名称冲突Concurrently,但这是唯一的原因吗?这里还有更重要的原因吗?

monads concurrency haskell promise

4
推荐指数
1
解决办法
155
查看次数

如何模式匹配Idris/Agda/Coq中的多个值?

我想在我的Expr定义中捕获类型有效性,并且在我定义时会出现问题Add,预期后面会有参数DecimalWhole参数,但我不知道如何模式匹配它们.以下是我的试验:

第一次试用:

data DataType = Text | Decimal | Whole

data Expr : DataType -> Type where
    Add : (Expr Decimal) -> (Expr Decimal) -> Expr Decimal
    Add : (Expr Whole) -> (Expr Whole) -> Expr Whole
Run Code Online (Sandbox Code Playgroud)

第二次试用:

data DataType = Text | Decimal | Whole

data Expr : DataType -> Type where
    Add : (Expr ty) -> (Expr ty) -> Expr ty
Run Code Online (Sandbox Code Playgroud)

第3次试用:

data DataType = Text | Decimal | Whole …
Run Code Online (Sandbox Code Playgroud)

coq agda dependent-type idris

3
推荐指数
1
解决办法
132
查看次数

是否可以定义我自己的 Show 类并重用 TextShow 和 Prelude.Show 的实例?

我正在尝试定义自己的Show名为 的类MyShow,并希望从TextShow 和 中“窃取”实例Prelude.Show,并且如果两者都存在,则更喜欢前一个。

我尝试了以下操作(showbPrec事情被简化以集中精力):

{-# LANGUAGE UndecidableInstances #-}

import Data.Text (Text, pack, unpack)
import qualified Prelude as P
import qualified TextShow as T

class MyShow a where
    showText :: a -> Text

instance {-# OVERLAPPING #-} TextShow a => MyShow a where
    showText x = T.showt x

instance {-# OVERLAPPABLE #-} P.Show a => MyShow a where
    showText x = pack (P.show x)
Run Code Online (Sandbox Code Playgroud)

但我被告知不允许重复实例声明Show,那么有什么方法可以定义我自己的实例并重用其他人的实例吗?

haskell typeclass

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

有什么想法在未来解决浮点数精度问题吗?

我们不能以无限精度存储小数,但可能有某种方式来表示它们就像我们在haskell中表示无限列表一样.

我想到的第一个想法是通过类似于Codata的东西来表示十进制数,因此对于任何给定的自然数k,我们可以将精确的十进制数计算为k位.

但有一些明显的问题,想想数a = 0.333...b = 0.666...,如果我们加在一起,我们得到了ans = 0.999...(数字序列),但我们永远无法知道是否a + b == 1在这种情况下.

我要的是,以某种方式定义十进制数,使之支持+,-,*,/,>,==运营,不管是什么+,-,*,/我们应用到这些十进制数字操作,我们得到新的十进制数,我们可以计算出它们给定任何自然数k精确到k位数.

我想知道:有什么想法可以解决这个问题吗?

theory precision haskell functional-programming codata

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

Hive DateTime Truncators(QUARTER,WEEK,DAYOFWEEK)?

是否有任何表达式QUARTER,WEEK以及DAYOFWEEKHive(v0.14.1)中的DateTime字段与MySql中的这些buildin函数做同样的事情?

这是我想要的规范(来自MySql doc):

季度 WEEK DAYOFWEEK

注意:1.函数quarter()是在Hive 1.3中引入的,但是我需要一个expr来支持更低版本.2.支持函数weekofyear()而不是week(),但是有一点不同.但没关系,所以请忽略这个.

sql datetime hive

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

如何知道在Node.js中实际解决Promise的时间?

当我们在nodejs中使用Promise时,给定Promise p,我们无法通过在"then"回调中记录currentTime来知道Promise p何时实际解析.

为了证明这一点,我在下面编写了测试代码(使用CoffeeScript):

# the procedure we want to profile
getData = (arg) ->
    new Promise (resolve) ->
        setTimeout ->
            resolve(arg + 1)
        , 100

# the main procedure
main = () ->
    beginTime = new Date()
    console.log beginTime.toISOString()
    getData(1).then (r) ->
        resolveTime = new Date()
        console.log resolveTime.toISOString()
        console.log resolveTime - beginTime
    cnt = 10**9
    --cnt while cnt > 0
    return cnt

main()
Run Code Online (Sandbox Code Playgroud)

运行上面的代码时,您会注意到resolveTime(代码运行到回调函数的时间)远远超过了beginTime的100ms.

所以如果我们想知道Promise何时实际解决了,怎么样?


我想知道确切的时间,因为我正在通过日志记录进行一些分析.当我在黑盒子外面进行一些分析时,我无法修改Promise p的实现.

那么,是否有一些函数,如promise.onUnderlyingConditionFulfilled(回调),或任何其他方式来实现这一点?

node.js promise es6-promise

-1
推荐指数
1
解决办法
118
查看次数