OCaml:使用一个范围构建一个列表,其中的大小id由浮点型的int强制转换确定



我试图在OCaml中建立一个列表,该列表从一个函数中获取其结束范围变量,该函数从浮点数返回int类型转换:

    #require "batteries"
    #require "pa_comprehension"
    #require "core_kernel"
open Batteries
open Core_kernel
let factor_of num fact = num mod fact == 0 ;;
let limit num =  Float.to_int (floor (sqrt num) ) ;;

未执行此列表的填充,原因是:

Error: This expression has type int but an expression was expected of type [< Downto | To ]

在(yummy)电池列表理解:

[? List: x | x <- 0--(limit num) ; factor_of num x ?] ;;

和core_kernel List构造函数(稍微少一些,但仍然很好读):

List.(range 0 (limit num) |> filter ~f:( fun x -> factor_of num x) );;

我认为limit num的返回被困在提供Float的(邪恶)单子内。to_int函数。当使用Float.int_of_float时也会发生这种情况,类型签名是相同的:

utop # Float.to_int;;
- : float -> int = <fun>

所以…我如何得到我的int '出'的单子,或者,如果这不是问题,发生了什么,我如何转换到一个实际的int是可用的这种方式?

还有,谁能给我指一个体面的"这些东西到底是什么:Monads"的教程,小,小的大脑?我对他们已经束手无策了。

UPDATE:该错误不是由任何一元行为(或使用,事实上)引起的,而是由于不正确地使用中缀运算符(mod)和函数式思维中的其他一些怪癖,我还没有完全理解。我不确定这篇文章是否应该存在,但也许它是一个例子,说明当你转向函数范式时可能会犯的错误…?

我已经找到了问题的根源。过度思考和深夜:

这个错误不是由任何单元行为(或使用单元,事实上)引起的,而是由于不正确地使用了中缀运算符(mod)和函数式思维中的其他一些怪癖,我还没有完全理解。我不确定这篇文章是否应该存在,但也许它是一个例子,说明当你转向函数范式时可能会犯的错误…?

感谢你帮我解决了这个问题,感谢你帮我改变了想法。Joe Gob还指出了代码中的主要问题。基于我的函数所需的类型,在float和int之间进行更多的强制转换。

这是正确的代码(deps)。Ml是一个需求文件):

   #use "deps.ml";;
open Batteries
open Core_kernel
let factor_of num fact = num mod fact == 0 ;;
let limit num = 2 * Float.to_int (floor (sqrt num)) ;;
let factor_list_of num =
  [? List: x | x <- 1--(limit (Int.to_float num)) ; factor_of num x ?]
let sum_factors num = ( List.fold_right (+) (factor_list_of num) 0 )
let is_perfect num = sum_factors num == num
let is_abundant num = sum_factors num > num
let is_deficient num = sum_factors num < num

基本上我已经被Ruby宠坏了,但我强烈建议Ruby爱好者学习ocaml,它是函数式语言中最接近Ruby代码风格的。

最新更新