有没有办法在OCaml中创建一个多态加法函数,对于整数和浮点数同样有效?所以例如,如果我有一个像这样的功能:
partialsums [1; 2; 3; 4; 5]我应该得到[1; 3; 6; 10; 15]但是这个函数不起作用,[1.; 2.; 3.; 4.; 5.]因为在OCaml int和浮点数绝对不能混合.但是如果我希望我的函数同样适用于int列表和浮点列表呢?是否存在int和float是子类型的一般类型?如果是这样,它是什么?我在这一点上有点失落.谢谢您的帮助?
Haskell 具有挑战性!到目前为止我想到的是,我可以执行以下操作来模拟 Haskell 中的 for 循环以从用户那里获取数字列表:
myList <- sequence [putStr "Enter an integer: " >> (
\s -> read s :: Int) <$> getLine | t <- [1..5]]
Run Code Online (Sandbox Code Playgroud)
伟大的!所以myList包含我输入的五个整数。伟大的!但问题就在这里。而不是迭代五次(或任何有限次数)的 for 循环如何将上述内容转换为等效的 while 循环?
所以我在想的是这个,但不幸的是它不起作用。有什么“神奇”的方法可以让它发挥作用吗?
takeWhile (\x -> x > 0) $ sequence [putStr "Enter an integer: " >> (
\s -> read s :: Int) <$> getLine | t <- [1..]]
Run Code Online (Sandbox Code Playgroud)
问题在于它(\x -> x > 0)适用于 Int。(或任何 Num 类型。)但是来自该列表的实际上是一堆 IO Int。 x > 0返回一个布尔值。我需要一个返回 IO …
我不明白为什么这不会加载到交互式Haskell解释器中.当我直接在GHCI中输入函数定义时,它的效果非常好.但是当我尝试从.hs文件加载函数定义时,就是当我收到错误消息时.有任何想法吗?谢谢您的帮助.
let partialsums lst = reverse ( partial_sums lst 0 [] ) where
partial_sums ls accum accumulator_list =
if ls == [] then accumulator_list else
partial_sums ( tail ls ) ( accum + head ls )
((accum + head ls) : accumulator_list)
Run Code Online (Sandbox Code Playgroud)
我在Python,Ruby和Ocaml中尝试过相同的函数定义.没问题!(Python的空白规则简单直观.Ruby和Ocaml不读取空格.在这些语言中,空格严格用于方便阅读程序的人.但我认为Haskell有一些非常严格的空白规则,我不熟悉.)
谢谢您的帮助.Haskell肯定看起来很有趣,但如果没有好教授的监督或指导,这是一种难以学习的语言.我只是想自己学习这门语言.