从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 curhead和filter(像上面的伪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) 示例代码:
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) 当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))
这段代码怎么样?
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版本具有严格注释时,这种差异如何工作?
(问题是基于我偶然发现的真实代码)
我尝试迭代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++ 方法可以做到这一点吗?
请考虑以下代码段
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是缺乏的当使用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) 有没有我可以发送UDP数据包的免费服务,它会回应告诉我什么是我的"真正的"UDP端口?(我的申请是在NAT背后)
这种服务可以让我用普通的php托管制作一个p2p协调服务器.
我一直在为我的索引玩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) 我觉得Carbon Human Interface Toolbox在64位二进制文件中不起作用.
Apple的文档说:
Carbon Help Manager不适用于64位应用程序.
...
控制管理中心不适用于64位应用程序.
...
数据浏览器不适用于64位应用程序.
...
我只想验证:
围绕这个没有解决方法.
如果是这样的话.为什么Apple的文档不能简单地说明这一点?
在下面的代码片段中:
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)