小编Ram*_*eka的帖子

换能器与部分应用的功能有何不同?

在阅读了介绍传感器的Clojure(http://blog.podsnap.com/ducers2.html)上的这篇文章之后,我对传感器的含义感到困惑.是否部分应用于mapHaskell,如map (+1)传感器?起初我认为这是使用部分应用程序的Clojure方式,但随后本文继续在Haskell中使用显式类型实现它.它在Haskell中有什么用?

haskell clojure transducer

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

haskell中循环列表和无限列表之间有什么区别?

引用@dfeuer对这个问题的回答:在Haskell中构造循环列表的最便宜的方法,它说使用循环列表"击败"垃圾收集器,因为它必须保留你从循环列表中分配的所有内容,直到你删除引用列表中的任何缺点单元格.

显然在Haskell中,循环列表和无限列表是两个独立的事物.这篇博客(https://unspecified.wordpress.com/2010/03/30/a-doubly-linked-list-in-haskell/)说如果你实现cycle如下:

cycle xs = xs ++ cycle xs
Run Code Online (Sandbox Code Playgroud)

它是一个无限列表,而不是循环列表.要使它循环,你必须像这样实现它(如Prelude源代码中所示):

cycle xs = xs' where xs' = xs ++ xs'
Run Code Online (Sandbox Code Playgroud)

这两种实现之间究竟有什么区别?为什么如果你在循环列表中的某个地方持有一个cons小区,垃圾收集器必须在分配之前保留所有内容?

haskell infinite circular-list

20
推荐指数
2
解决办法
2206
查看次数

在解构和重构对象时,GHC是否会创建对象的新副本?

如果我有类似的类型data T = T Int String和这样的函数:

identity :: T -> T
identity (T a b) = T a b
Run Code Online (Sandbox Code Playgroud)

在模式匹配中解构之后,GHC是否创建了一个包含对同一个Int和String的引用的新T对象?或者它返回它收到的完全相同的对象(具有相同的内存地址)?我知道他们在语义上是等价的,我只是好奇.

haskell pattern-matching ghc

18
推荐指数
2
解决办法
413
查看次数

Pascal三角形的评价是多少?

如果我将此常量pascal定义为

pascal :: [[Int]]
pascal = iterate newrow [1]
  where newrow = (zipWith (+) <*> tail) . ([0]++) . (++[0])
Run Code Online (Sandbox Code Playgroud)

pascal !! 50 !! 50在GHCI中评估,这个三角形的大部分是什么?这种懒惰是否意味着只计算必要的值(加上一堆thunk)?

haskell lazy-evaluation

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

如何模拟货币之间兑换货币的货币,货币和银行?

嘿所以我正在阅读关于Java中类型驱动开发的这篇文章.我无法学习Java类型,所以我尝试在Haskell中编写它.但是,我有两个问题:

  1. 我不知道如何实现货币与实际货币之间的差异.起初我认为货币只是货币的类型(我认为这是有意义的),像这样data Dollar = Dollar Double,价值就像Dollar 4.0货币,Dollar类型就是货币.我认为Dollar :: Double -> Dollar这将是未出口的东西.
  2. 这导致了一个问题,我无法建立一个交换金钱的银行.我在想类似的东西exchange :: (Money a, Money b) =>[ExchangeRate] -> a -> b.然后银行只是一个包含ExchangeRates集合的对象,但我不知道ExchangeRate是什么类型.

我到目前为止的代码是:

class Money m where
    money :: (Money m) => Double -> m
    amount :: (Money m) => m -> Double
    add :: (Money m) => m -> m -> m
    add a b = money $ amount a + amount b

class (Money a, Money …
Run Code Online (Sandbox Code Playgroud)

haskell types

13
推荐指数
2
解决办法
2404
查看次数

Haskell可以评估而不是垃圾收集列表中的随机索引吗?

据我所知,Haskell只有当某些东西超出范围时才会收集垃圾,因此顶级绑定只会被评估一次并且永远不会超出范围.因此,如果我在GHCI中运行此代码,将评估并保存前50个元素.

let xs = map f [0..]
take 50 xs
Run Code Online (Sandbox Code Playgroud)

我的问题是当我执行以下代码段时会发生什么:xs !! 99.垃圾收集器保存了什么?可以

  1. 保留索引0 - 49的结果,索引50 - 98的thunk,索引99的结果,索引100+的thunk
  2. 保留索引0 - 49的结果,索引50+的thunk
  3. 保留索引0 - 99的结果,索引100+的thunk

garbage-collection haskell lazy-evaluation

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

何时需要显式递归?

在Haskell中,尽可能在高阶函数(如折叠,贴图和展开)中编写尽可能多的代码是惯用的.那么哪些代码不能用那些高阶函数编写?何时需要显式递归?

recursion haskell idioms

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

在Haskell中,将函数应用于列表的每个第N个元素的最常用方法是什么?

它非常常见,我遇到了一些元素列表,xs并希望对每个第N个元素做一些事情.最简单的例子是Sieve或Erastothenes,你想要"敲掉"给定素数的每一个倍数.我可以这样做的两种方法是通过计数器变量传递显式递归; 或zipWith ($) (cycle (replicate (n-1) id ++ f)).那么哪种方式更好/更优雅/更常用,或者是否有一些mapEveryN :: (a -> a) -> Int -> [a] -> [a]我没有找到的库函数?

haskell list repeat sieve-of-eratosthenes circular-list

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

有没有办法在这个算法中不使用显式递归?

所以我正在努力将模式与列表匹配,例如: match "abba" "redbluebluered" -> True或者 match "abba" "redblueblue" -> False等等.我写了一个有效的算法,我认为这是合理可行的,但我不确定是否有更好的方法这样做没有明确的递归.

import Data.HashMap.Strict as M
match :: (Eq a, Eq k, Hashable k) => [k] -> [a] -> HashMap k [a] -> Bool
match []     [] _ = True
match []     _  _ = False
match _      [] _ = False
match (p:ps) s  m =
  case M.lookup p m of
    Just v ->
      case stripPrefix v s of
        Just post -> match ps post m
        Nothing   -> …
Run Code Online (Sandbox Code Playgroud)

recursion haskell coding-style fold

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

我可以使用DataKinds编写一个函数来返回由参数编码的类型的值吗?

假设我有一种货币类型:

data Currency = USD | EUR | YEN
Run Code Online (Sandbox Code Playgroud)

和存储int的Money类型,并由给定的Currency参数化(Currency被提升为具有DataKinds扩展名的类型).

data Money :: Currency -> * where
    Money :: Int -> Money c
Run Code Online (Sandbox Code Playgroud)

是否可以编写一个函数,该函数moneyOf以其参数为货币值,并返回一个Money值,该值由相应的Currency值类型参数化?比如moneyOf :: Currency -> Money c,但我们得到的编译时保证c是从Currency值生成的类型?

haskell types data-kinds

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