我不明白出了什么问题。我使用 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) 我对数据类型感到困惑。假设我们有
{-# 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
在科特林我可以做
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)
这个样本也不能符合。
我尝试通过以下方式来实现:
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 ×3
data-kinds ×2
jenetics ×1
kotlin ×1
massiv ×1
optimization ×1
performance ×1
profiling ×1
types ×1