小编Hew*_*lff的帖子

为什么Int不可推广?

我希望得到二维或三维点,使得二维点和三维点可以共享代码,但编译器可以区分它们.这是第一次尝试.

{-# 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中的固定长度矢量类型,但这似乎过于复杂.

haskell ghc

4
推荐指数
2
解决办法
168
查看次数

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)

haskell memory-leaks lazy-evaluation

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

调用Unix shell脚本的方法(".","source")

要激活TurboGears virtualenv(仅作为示例),请执行以下操作:

. bin/activate
Run Code Online (Sandbox Code Playgroud)

或这个:

source bin/activate
Run Code Online (Sandbox Code Playgroud)
  1. 为什么当前目录"." 作为一个命令工作?

  2. 为什么要使用"来源"或"." 什么?为什么不简单地"bin/activate"?

(我对此进行了一些网络搜索,但是"."和"来源"得到了很多糟糕的点击.)

unix bash

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

标签 统计

haskell ×2

bash ×1

ghc ×1

lazy-evaluation ×1

memory-leaks ×1

unix ×1