我希望得到二维或三维点,使得二维点和三维点可以共享代码,但编译器可以区分它们.这是第一次尝试.
{-# LANGUAGE DataKinds, GADTs, KindSignatures #-}
data Dimension = D2 | D3
data Point :: Dimension -> * where
Point :: Dimension -> [Int] -> Point d
origin = Point D2 [0, 0]
Run Code Online (Sandbox Code Playgroud)
到目前为止工作正常.这是一个简化版本:
data Point' :: Int -> * where
Point' :: Int -> [Int] -> Point' d
origin' = Point' 2 [0, 0]
Run Code Online (Sandbox Code Playgroud)
这不编译:‘Int’ of kind ‘*’ is not promotable. 有关GHC 7.10.3 数据类型提升的文档列出了类型可能无法提升的各种原因(例如,如果它已经涉及提升类型),但我不明白为什么它们会排除Int.
(1)为什么会出现这个错误?
作为奖金,
(2)是否有合理的解决方案或替代方法?搜索显示,例如,Haskell中的固定长度矢量类型,但这似乎过于复杂.
我想出了原始输入问题的以下代码,正如SO Haskell中读到的原始键盘输入所讨论的那样.不幸的是,当我去ghci,运行getAllInput并点击右箭头键时,它永远不会返回.除非我很快就杀了它,它似乎占用了我所有的内存,以便其他应用程序停止响应,我必须重新启动操作系统.在活动监视器中,我可以看到ghc进程的内存快速进入千兆字节.
(1)我认为问题出在递归调用中go,通过hReady之前的调用来懒惰地评估getChar; 这意味着hReady保持返回true并且堆栈永远增长.这看起来有道理吗?
(2)我习惯于很快会导致堆栈溢出异常的语言,所以它不会阻止我工作.有没有一般的方法来防止这种大规模的内存泄漏?也许以内存使用的硬限制开始ghci?
import System.IO
-- For example, should get "\ESC[C" from the user hitting the right arrow key.
getAllInput :: IO [Char]
getAllInput =
let
go :: IO [Char] -> IO [Char]
go chars = do
more <- hReady stdin
if more then go (added chars getChar) else chars
added :: IO [Char] -> IO Char -> IO [Char]
added chars char = do
chars1 …Run Code Online (Sandbox Code Playgroud) 要激活TurboGears virtualenv(仅作为示例),请执行以下操作:
. bin/activate
Run Code Online (Sandbox Code Playgroud)
或这个:
source bin/activate
Run Code Online (Sandbox Code Playgroud)
为什么当前目录"." 作为一个命令工作?
为什么要使用"来源"或"." 什么?为什么不简单地"bin/activate"?
(我对此进行了一些网络搜索,但是"."和"来源"得到了很多糟糕的点击.)