我試圖在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