小编Tru*_*arg的帖子

为什么将函数移动到模块时运行时间会增加?

我不明白出了什么问题。我使用 stack new 创建了模板项目,添加一些代码:

module Main where

import Lib
import           Data.Massiv.Array           (Sz (..), Vector)

import qualified Data.Massiv.Array           as A
import Data.Time.Clock.POSIX

t mul = round . (mul *) <$> getPOSIXTime
timeMillis = t 1000

area :: BBox -> Double
area (BBox (x1, y1) (x2, y2)) = (x2 - x1) * (y2 - y1)

sumOfAreas :: Vector A.DS BBox -> Double
sumOfAreas bboxes = A.sfoldl (\acc box -> acc + area box) 0 bboxes

main :: IO ()
main = do …
Run Code Online (Sandbox Code Playgroud)

optimization performance profiling haskell massiv

5
推荐指数
0
解决办法
204
查看次数

使用数据类型对函数类型进行约束

我对数据类型感到困惑。假设我们有

{-# LANGUAGE DataKinds #-}
...
data Format
  = Photo
      { bytes :: Int
      }
  | Video
      { bytes       :: Int
      , durationSec :: Int
      }
Run Code Online (Sandbox Code Playgroud)

我想让 then 具有提升类型的功能:

createVideo :: Int -> Int -> 'Video
createVideo _ _ = error "Not implemented"
Run Code Online (Sandbox Code Playgroud)

编译器会询问我们参数,并用它们给出消息“Video Int Int has kind ‘Format’”。我希望这种编译时行为类似于 kotlin:

sealed class Format {

  abstract val bytes: Int
  data class Photo(override val bytes: Int) : Format()
  data class Video(override val bytes: Int, val durationSec: Int) : Format()
}

private fun …
Run Code Online (Sandbox Code Playgroud)

haskell types functional-programming data-kinds kotlin-sealed

2
推荐指数
1
解决办法
255
查看次数

相当于 Kotlin 不变类型的 Haskell

在科特林我可以做

sealed class Substance {
    object Uranus : Substance()
    object Mercury: Substance()
    object Ammonia : Substance()
}

data class DangerousBox<T : Substance>(val item: T)

fun main() {
    val uranus = DangerousBox<Substance.Uranus>(Substance.Uranus)
    val mercury: DangerousBox<Substance.Mercury> = uranus
}
Run Code Online (Sandbox Code Playgroud)

现在我有不变的类型DangerousBox<Substance.Uranus>, DangerousBox<Substance.Mercury>等,所以上面的示例将无法编译。

如何在 Haskell 中做到这一点?

理想情况下我想要类型

uranus :: DangerousBox Uranus
uranus = DangerousBox Mercury
Run Code Online (Sandbox Code Playgroud)

这个样本也不能符合。

我尝试通过以下方式来实现:

  1. 模块化约束。我有模块
module Sample.Types.Boxes
  ( Substance(..)
  , dangerousBox
  , VDangerousBox {- no Con-}
  ) where

data Substance
  = Uranus
  | Mercury
  | Ammonia
  deriving (Show)

data …
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming kotlin data-kinds jenetics

1
推荐指数
1
解决办法
308
查看次数