我试图在Prelude库中仅使用函数的两个数字列表之间实现一个点积。我写了下面的功能: dot :: Num a => [a] -> [a] -> a
dot x y = sum $ zipWith (*) x y
我测试如下: main :: IO()
main = do
let n = 10^6
x = (replicate n 2.0) :: [Double]
代码加载:进入交互 modPow :: Int -> Int -> Int -> Int
modPow a k m = (a^2 `mod` m)^(k `div` 2)
代码: (13481503^2 `mod` 46340)^(11237126 `div` 2)
即a = 13481503 ,k = 11237126,m = 46340 前者返回一个完全不同的数字,当在ghci中调用
Haskell完全是关于抽象。但是由于所有抽象(多态)数据的共同表示 - 堆中的指针,抽象花费我们额外的CPU周期和额外的内存使用。有一些方法可以使抽象代码更好地满足高性能需求。据我所知,一种方法是专业化 - 基本上额外的代码生成(手动或编译器),是正确的? 让我们假设下面所有的代码是严格 如果我们有一个功能sum(这有助于编译器进行更多的优化?): sum :: (Num a) => a ->
我已经找到一种方法来一个Nat转换成Integer使用Proxy和natVal,你可以在下面的代码中看到: {-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import Data.Proxy (Proxy)
import Data.Monoid ((<>))
impor