我一直在做项目Euler问题来学习Haskell.
我在途中遇到了一些障碍,但设法解决了问题14.问题是,起始数量低于1 000 000的产生了最长的Collatz链(链条开始后数量可以超过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是如何做到的.但是这次,我想到给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".
因此,PropertyInfo 有一个 GetSetMethod 方法,该方法返回该属性的 setter 方法。它还有一个 SetMethod 属性,可以执行相同的操作(据我所知)。
我问这个问题是因为如果该属性不是公共的,而 SetMethod 仍然有效,则 GetSetMethod 似乎会返回 null。
我在 MSDN 上找不到太多内容。
所以问题很简单.给定一个图(我希望图的结构在这个问题上没有多大关系),我该怎么做呢?
我最近问过一个关于生成列表的问题,其中每个元素都会在其末尾附加许多元素.答案应该有希望让我做一个我需要做BFS的队列.但是搜索需要另一个关键组件,它将节点标记为已访问,因此我们不会再次检查它们.这也需要在算法的执行上没有开销.无论是标记还是阅读.
既然Haskell不允许我改变状态,那我该怎么做呢?
(我不是在寻找将命令式代码翻译成Haskell的方法.惯用的Haskell解决方案会非常棒.)
好吧,所以我基本上试图将绑定运算符添加到选项类型中,似乎我尝试的所有内容都有一些不明显的警告,阻止我这样做.我怀疑是否与.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) 我有一个用例,我需要一个具有恒定时间插入的结构,然后可以从最旧到最新迭代.基本上是一个队列.区别在于插入和迭代在单独的步骤中发生到一个简单的列表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) 假设我有一个描述某些数据结构的额外文件.在一个Haskell模块中,我有一个TH声明,它接受该文件的内容并生成数据类型.
每次外部文件更改时,如何强制该模块重新编译?
我有一个数组,我想把它投射到一个对象.这是我的代码.
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#中做,所以这里的问题是什么?
假设我想提出两个请求。第一个将登录信息发送到服务器,第二个检索一些需要身份验证的数据。
有什么特别的我需要做才能获得这种行为http-client吗?它的工作方式wreq是Session在两个请求中共享相同的值。饼干和一切都得到了自动处理。
我认为http-client如果我分享相同的内容也是如此,Manager但情况似乎并非如此。我收到一条响应,表明我没有登录。
不幸的是,由于各种原因,我无法真正提供可编译的代码示例。
假设我有一个String(或者Text其他)包含有效的Haskell代码.有没有办法将其转换为[Dec]模板Haskell?
我很确定AST没有直接进入GHC,因此无论如何都会有打印然后解析阶段.
这将是很好的,因为它将允许TH的不同"后端".例如,你可以使用AST haskell-src-exts支持比TH更多的Haskell语法.
我有这个简单的代码
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) 我有一个具有单个空案例的联合类型.
type Default =
| Default
Run Code Online (Sandbox Code Playgroud)
这种类型有一个目的,但它并不意味着可见或可用.不幸的是,我必须在需要可见的内联函数中使用它.这可以防止我将类型或案例设为私有.
我提出的解决方案是使用CompilerMessageAttribute它来发出错误信号,无论何时使用它.这没关系,但现在我无法编译自己的程序集,因为IT使用它.
有没有办法只在引用我的程序集的程序集使用它时发出错误信号?
haskell ×8
f# ×3
c# ×1
cabal ×1
collatz ×1
graph-theory ×1
inline ×1
linked-list ×1
optimization ×1
optional ×1
reflection ×1
typeclass ×1