小编yai*_*chu的帖子

尴尬的monad变压器堆栈

从Google Code Jam解决问题(2009.1AA:"多基础幸福")我提出了一个尴尬(代码方面)的解决方案,我对如何改进它感兴趣.

不久,问题描述是:找到大于1的最小数字,对于来自给定列表的所有碱基,迭代计算数字的平方和达到1.

或伪Haskell中的描述(如果elem总是可以为无限列表工作则可以解决它的代码):

solution =
  head . (`filter` [2..]) .
  all ((1 `elem`) . (`iterate` i) . sumSquareOfDigitsInBase)
Run Code Online (Sandbox Code Playgroud)

而我的尴尬解决方案:

  • 尴尬我的意思是它有这样的代码: happy <- lift . lift . lift $ isHappy Set.empty base cur
  • 我记住了isHappy函数的结果.使用State monad作为memoized结果Map.
  • 试图找到第一个解决方案,我没有使用headfilter(像上面的伪haskell那样),因为计算不纯(改变状态).所以我通过使用带有计数器的StateT和一个MaybeT来迭代,以在条件成立时终止计算.
  • 已经在一个内部MaybeT (StateT a (State b)),如果条件不适用于一个基数,则不需要检查其他基数,所以我MaybeT在堆栈中有另一个.

码:

import Control.Monad.Maybe
import Control.Monad.State
import Data.Maybe
import qualified Data.Map as Map
import qualified Data.Set as Set

type IsHappyMemo = State (Map.Map (Integer, Integer) Bool)

isHappy …
Run Code Online (Sandbox Code Playgroud)

haskell monad-transformers

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

Haskell类型转换问题

示例代码:

fac :: Int ? Int
fac 0 = 1
fac n = n * fac (n-1)

main = do
        putStrLn show fac 10
Run Code Online (Sandbox Code Playgroud)

错误:

Couldnt match expected type 'String'
       against inferred type 'a -> String'
In the first argument of 'putStrLn', namely 'show'
In the expression: putStrLn show fac 10
Run Code Online (Sandbox Code Playgroud)

haskell types casting

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

minimumBy和maximumBy之间不一致

Data.List.minimumBy遇到相同的列表元素时,它会选择最先出现的元素,但maximumBy选择最后一个:

> import Data.List
> import Data.Ord
> minimumBy (const (const EQ)) "Hello world!"
'H'
> maximumBy (const (const EQ)) "Hello world!"
'!'
Run Code Online (Sandbox Code Playgroud)

这是设计还是巧合?这种行为背后有一个很好的推理吗?

请注意,利用这样的假设可以使代码更简洁 - 即minimumOn length texts不使用明确的打破连接器,例如map snd (minimumOn (\(p, t) -> (length t, p)) (zip [0..] texts))

haskell

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

带有严格注释的`newtype`和`data`之间的区别

这段代码怎么样?

data D = D { _d :: ![P] } -- Note the strictness annotation!
Run Code Online (Sandbox Code Playgroud)

与此相比

newtype D = D { _d :: [P] }
Run Code Online (Sandbox Code Playgroud)

对相关问题回答是:

数据和newtype之间的主要区别在于,数据是数据构造函数是惰性的,而newtype是严格的

data版本具有严格注释时,这种差异如何工作?

(问题是基于我偶然发现的真实代码)

haskell lazy-evaluation newtype

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

迭代 std::Optional

我尝试迭代std::optional

for (auto x : optionalValue)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

预期如果为optionalValue空则不执行任何操作,但如果其中有值则执行一次迭代,就像它在 Haskell 中一样(可以说这很std::optional流行):

forM optionalValue
( \x ->
    ...
)
Run Code Online (Sandbox Code Playgroud)

为什么我不能迭代可选的?还有另一种更标准的 C++ 方法可以做到这一点吗?

c++ option-type stdoptional

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

Haskell FFI:ForeignPtr似乎没有被释放(也许是一个GHC错误?)

请考虑以下代码段

import qualified Foreign.Concurrent
import Foreign.Ptr (nullPtr)

main :: IO ()
main = do
  putStrLn "start"
  a <- Foreign.Concurrent.newForeignPtr nullPtr $
    putStrLn "a was deleted"
  putStrLn "end"
Run Code Online (Sandbox Code Playgroud)

它产生以下输出:

start
end
Run Code Online (Sandbox Code Playgroud)

我曾希望看到" a was deleted"后地方start..

我不知道发生了什么事.我有一些猜测:

  • 程序完成时,垃圾收集器不会收集剩余的对象
  • putStrLnmain完成后停止工作.(顺便说一句,我和国外进口同样的东西puts也得到了同样的结果)
  • 我的理解ForeignPtr是缺乏的
  • GHC错误?(环境:GHC 6.10.3,Intel Mac)

当使用Foreign.ForeignPtr.newForeignPtr而不是Foreign.Concurrent.newForeignPtr它似乎工作:

{-# LANGUAGE ForeignFunctionInterface #-}

import Foreign.C.String (CString, newCString)
import Foreign.ForeignPtr (newForeignPtr)
import Foreign.Ptr (FunPtr)

foreign import ccall "&puts" puts :: FunPtr (CString -> IO ()) …
Run Code Online (Sandbox Code Playgroud)

garbage-collection haskell ffi

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

找到我的UDP套接字的"真实"端口的方法?

有没有我可以发送UDP数据包的免费服务,它会回应告诉我什么是我的"真正的"UDP端口?(我的申请是在NAT背后)

这种服务可以让我用普通的php托管制作一个p2p协调服务器.

  • p2p客户端将从此服务中了解其UDP端口
  • 然后他们将通过HTTP联系我的服务器(这是常规的Web托管允许的)并告诉它他们的端口(和ip,它通常提供给cgi脚本)
  • 我的服务器将为客户端提供其他客户端的IP地址和端口.

sockets p2p udp nat

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

派生类型及其依赖项

我一直在为我的索引玩newtype包装器以避免错误,我有一些像这样的代码:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

newtype PersonIdx = PersonIdx Int
  deriving (Enum, Eq, Integral, Num, Ord, Real, Show)
Run Code Online (Sandbox Code Playgroud)

要派生Integral,还必须派生所有依赖项(因此上面的类型类列表).

有没有办法让它Integral随之衍生出所有依赖关系?我会想象:

newtype PersonIdx = PersonIdx Int
  deriving (Integral(..))
Run Code Online (Sandbox Code Playgroud)

haskell typeclass derived-types deriving

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

OSX 64位二进制文​​件中没有Carbon Human-Interface-Toolbox?

我觉得Carbon Human Interface Toolbox在64位二进制文​​件中不起作用.

Apple的文档说:

Carbon Help Manager不适用于64位应用程序.

...

控制管理中心不适用于64位应用程序.

...

数据浏览器不适用于64位应用程序.

...

我只想验证:

  • 围绕这个没有解决方法.

  • 如果是这样的话.为什么Apple的文档不能简单地说明这一点?

macos macos-carbon

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

在“.collect()”之前是否有更好的替代“.map(|x| *x)”?

在下面的代码片段中:

let b: Vec<usize> = a.iter().filter(|x| **x > 5).map(|x| *x).collect();
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来使b成为值向量而不是引用?(代替.map(|x| *x)

有没有类似的东西:

fn iter_values<T : Copy>(c: &Vec<T>) -> std::iter::Map<std::slice::Iter<T>, fn(&T) -> T> {
    c.iter().map(|x| *x)
}
Run Code Online (Sandbox Code Playgroud)

可以像这样使用:

let b: Vec<usize> = iter_values(&a).filter(|x| *x > 5).collect();
Run Code Online (Sandbox Code Playgroud)

reference lifetime rust

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