小编Luk*_*vat的帖子

优化Haskell中最长的Collat​​z链

我一直在做项目Euler问题来学习Haskell.

我在途中遇到了一些障碍,但设法解决了问题14.问题是,起始数量低于1 000 000的产生了最长的Collat​​z链(链条开始后数量可以超过100万).

我尝试了几种解决方案但没有一种方法可行.我想反过来.从1开始并在数字超过一百万时终止但显然不起作用,因为这些条款可能高于一百万.

我已经尝试过记忆正常的算法,但是再次,数字太多,以及更多的记忆.

我已经读到最明显的解决方案应该适用于此,但出于某种原因,我的解决方案需要10秒以上才能达到最大值20 000.更别说100万了.

这是我目前正在使用的代码:

reg_collatz 1 = 1
reg_collatz n
        | even n        = 1 + reg_collatz (n `div` 2)
        | otherwise     = 1 + reg_collatz (n * 3 + 1)

solution = foldl1 (\a n -> max a (reg_collatz n)) [1..20000]
Run Code Online (Sandbox Code Playgroud)

非常欢迎任何帮助.

haskell collatz

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

Haskell如何知道哪个函数可以先运行?

我正在编写一种具有一些功能元素的自定义语言.当我卡在某个地方时,我通常会检查Haskell是如何做到的.但是这次,我想到给Haskell一个例子的问题有点复杂.

这是怎么回事.

假设我们有以下行

a . b
Run Code Online (Sandbox Code Playgroud)

在哈斯克尔.显然,我们正在组成两个函数,a和b.但是如果函数a将另外两个函数作为参数怎么办呢.是什么阻止了它的运作.和b?您可以将它括在括号中,但这应该没有区别,因为表达式仍然计算为函数,前缀1和前缀函数优先于中缀函数.

如果你这样做

(+) 2 3 * 5
Run Code Online (Sandbox Code Playgroud)

例如,它将输出25而不是17.

基本上我要问的是,当你希望中缀函数在前面的前缀函数之前运行时,Haskell使用什么机制.

所以.如果"a"是一个以两个函数作为参数的函数.你如何阻止Haskell解释

a . b
Run Code Online (Sandbox Code Playgroud)

as"apply.和b to the function a"并将其解释为"compose functions a and b".

haskell infix-notation

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

PropertyInfo 上的 GetSetMethod 和 SetMethod 之间有什么区别?

因此,PropertyInfo 有一个 GetSetMethod 方法,该方法返回该属性的 setter 方法。它还有一个 SetMethod 属性,可以执行相同的操作(据我所知)。

我问这个问题是因为如果该属性不是公共的,而 SetMethod 仍然有效,则 GetSetMethod 似乎会返回 null。

我在 MSDN 上找不到太多内容。

c# reflection

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

首先遍历图广度,标记Haskell中的访问节点

所以问题很简单.给定一个图(我希望图的结构在这个问题上没有多大关系),我该怎么做呢?

我最近问过一个关于生成列表的问题,其中每个元素都会在其末尾附加许多元素.答案应该有希望让我做一个我需要做BFS的队列.但是搜索需要另一个关键组件,它将节点标记为已访问,因此我们不会再次检查它们.这也需要在算法的执行上没有开销.无论是标记还是阅读.

既然Haskell不允许我改变状态,那我该怎么做呢?

(我不是在寻找将命令式代码翻译成Haskell的方法.惯用的Haskell解决方案会非常棒.)

haskell graph-theory breadth-first-search

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

在类型扩展中重载运算符

好吧,所以我基本上试图将绑定运算符添加到选项类型中,似乎我尝试的所有内容都有一些不明显的警告,阻止我这样做.我怀疑是否与.NET类型系统的限制有关,可能与用户代码中无法实现类型类的原因相同.

无论如何,我尝试过几件事.

首先,我尝试了以下内容

let (>>=) m f = ???
Run Code Online (Sandbox Code Playgroud)

意识到我想根据类型做不同的事情m.F#不允许在函数上重载,但.NET允许在方法上使用它们,所以尝试第二个:

type Mon<'a> =
    static member Bind(m : Option<'a>, f : ('a -> Option<'b>)) =
        match m with
        | None -> None
        | Some x -> f x
    static member Bind(m : List<'a>, f : ('a -> List<'b>)) = 
        List.map f m |> List.concat

let (>>=) m f = Mon.Bind(m, f)
Run Code Online (Sandbox Code Playgroud)

没有骰子.无法根据以前给定的类型信息选择唯一的重载.添加类型注释.

我已经尝试使运算符内联,但它仍然给出相同的错误.

然后我想我可以使>>=运算符成为一个类型的成员.我很确定这会有效,但我认为我不能在现有类型上进行破解.您可以扩展现有类型,type Option<'a> with但不能将运算符作为扩展.

这是我对此代码的最后一次尝试:

type Option<'a> with
    static member (>>=) (m : …
Run Code Online (Sandbox Code Playgroud)

f# inline operator-overloading optional

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

为什么我的可变链表慢于不可变变量?

我有一个用例,我需要一个具有恒定时间插入的结构,然后可以从最旧到最新迭代.基本上是一个队列.区别在于插入和迭代在单独的步骤中发生到一个简单的列表ALMOST足够好.我只需要在最后做一个反向.这反过来是我想要摆脱的.

我打算在STmonad中自己实现这个.由此产生的性能慢4倍.我将包含所有相关代码(它是自包含的)以及我用来对其进行基准测试的函数.您可以在安装timeit软件包的情况下自行编译.

{-# LANGUAGE ViewPatterns #-}
module LinkedListSpecial where

import Prelude hiding (mapM_)
import Control.Monad.ST
import Data.STRef
import Data.Foldable (mapM_, foldlM, forM_)
import System.TimeIt

data LLN s a = Stub (STRef s (Maybe (LLN s a)))
             | LLN a (STRef s (Maybe (LLN s a)))

getRef :: LLN s a -> STRef s (Maybe (LLN s a))
getRef (Stub ref)  = ref
getRef (LLN _ ref) = ref

emptyNode :: ST s (LLN s a)
emptyNode …
Run Code Online (Sandbox Code Playgroud)

optimization haskell linked-list

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

重新编译时显式依赖额外的源文件

假设我有一个描述某些数据结构的额外文件.在一个Haskell模块中,我有一个TH声明,它接受该文件的内容并生成数据类型.

每次外部文件更改时,如何强制该模块重新编译?

haskell cabal

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

将数组转换为对象

我有一个数组,我想把它投射到一个对象.这是我的代码.

let a = [| 1 |]
let b = a :?> obj
Run Code Online (Sandbox Code Playgroud)

但它告诉我int [] has no proper subtypes and cannot be used as a source of runtime type coercion.我很确定我可以(object)在没有编译器抱怨的情况下在C#中做,所以这里的问题是什么?

f#

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

与 http 客户端的会话

假设我想提出两个请求。第一个将登录信息发送到服务器,第二个检索一些需要身份验证的数据。

有什么特别的我需要做才能获得这种行为http-client吗?它的工作方式wreqSession在两个请求中共享相同的值。饼干和一切都得到了自动处理。

我认为http-client如果我分享相同的内容也是如此,Manager但情况似乎并非如此。我收到一条响应,表明我没有登录。

不幸的是,由于各种原因,我无法真正提供可编译的代码示例。

haskell

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

是否可以使用Template Haskell发出原始源代码?

假设我有一个String(或者Text其他)包含有效的Haskell代码.有没有办法将其转换为[Dec]模板Haskell?

我很确定AST没有直接进入GHC,因此无论如何都会有打印然后解析阶段.

这将是很好的,因为它将允许TH的不同"后端".例如,你可以使用AST haskell-src-exts支持比TH更多的Haskell语法.

haskell template-haskell

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

Haskell类型错误.无法匹配(Int - > Int)与(Bits b => Int - > b)

我有这个简单的代码

class Hashable a where
    hash :: Bits b => a -> b

instance Hashable Int where
    hash = id
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误

Could not deduce (b ~ Int)
from the context (Bits b)
  bound by the type signature for hash :: Bits b => Int -> b
  at Memo.hs:11:5-8
  `b' is a rigid type variable bound by
      the type signature for hash :: Bits b => Int -> b at Memo.hs:11:5
Expected type: Int -> b
  Actual type: Int -> Int …
Run Code Online (Sandbox Code Playgroud)

haskell typeclass

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

使用CompilerMessageAttribute生成编译器错误,但仅在其他程序集中生成

我有一个具有单个空案例的联合类型.

type Default =
    | Default
Run Code Online (Sandbox Code Playgroud)

这种类型有一个目的,但它并不意味着可见或可用.不幸的是,我必须在需要可见的内联函数中使用它.这可以防止我将类型或案例设为私有.

我提出的解决方案是使用CompilerMessageAttribute它来发出错误信号,无论何时使用它.这没关系,但现在我无法编译自己的程序集,因为IT使用它.

有没有办法只在引用我的程序集的程序集使用它时发出错误信号?

f#

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