根据另一个问题,Real World Haskell 的部分内容现已过时。我只阅读了第 5 章,但是我在将一个简单示例编译为可执行二进制文件时遇到了问题。
给出了两个模块:
module SimpleJSON
(
JValue(..)
, getString
, getInt
, getDouble
, getBool
, getObject
, getArray
, isNull
) where
data JValue = JString String
| JNumber Double
| JBool Bool
| JNull
| JObject [ (String, JValue) ]
| JArray [ JValue ]
deriving (Eq, Ord, Show)
getString :: JValue -> Maybe String
getString (JString s) = Just s
getString _ = Nothing
getInt (JNumber n) = Just (truncate n) …Run Code Online (Sandbox Code Playgroud) 我一直无法使用 Cabal 安装任何软件包,收到一条错误消息,指出 tar 存档不在预期目录中。例如,如果我尝试这样做cabal install mtl,我会收到以下错误:
正在解决依赖项...无法安装 text-1.2.1.1 cabal:错误:某些软件包无法安装:text-1.2.1.1 在解压缩软件包时失败。例外是:用户错误(tar 存档中的文件不在预期目录中。预期:“.”但得到以下层次结构:[“text-1.2.1.1”])
我已经运行cabal update,并cabal --version给出以下内容:
$ cabal --version
cabal-install version 1.22.5.0
using version 1.22.4.0 of the Cabal library
Run Code Online (Sandbox Code Playgroud)
任何人都知道为什么会发生这种情况?如果您需要任何其他信息,请告诉我。
我在ghci并发现以下工作:
let foo = ["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)
...但这不起作用:
let bar = ["a",
"b",
"c"]
Run Code Online (Sandbox Code Playgroud)
......也不是这样:
let baz = ["a"] ++
["b"] ++
["c"]
Run Code Online (Sandbox Code Playgroud)
当我尝试将其编译为文件时会出现相同的错误,因此这不是来自ghci使用ghc.
错误:
[1 of 1] Compiling Main ( test.hs, test.o )
test.hs:3:1: error:
parse error (possibly incorrect indentation or mismatched brackets)
Run Code Online (Sandbox Code Playgroud) 有-S选项和简单的程序:
main = do
print "Hello"
main
Run Code Online (Sandbox Code Playgroud)
我可以看到它产生了一些垃圾:
[...]
1024232 4904 45992 0.000 0.000 0.428 0.530 0 0 (Gen: 1)
0 0.000 0.000
1,242,080,056 bytes allocated in the heap
271,656 bytes copied during GC
[...]
Run Code Online (Sandbox Code Playgroud)
但删除后print显然没有.是否有可用于编写无GC程序的无库存核心库子集?
编辑:最近有关于线性类型的工作似乎有可能实现这样的功能.
我很困惑的是GHC在看似错误的行为中发生了相当简单的Haskell程序.
请考虑以下代码:
import System.IO
output :: [String] -> IO()
output stringList = sequence_ $ map putStrLn stringList
main :: IO ()
s = show
main = output [
s 42,
s True
]
Run Code Online (Sandbox Code Playgroud)
在GHC 8.4.3中产生以下输出:
$ runghc parameterize.hs
.hs:9:7: error:
• No instance for (Num Bool) arising from the literal ‘42’
• In the first argument of ‘s’, namely ‘42’
In the expression: s 42
In the first argument of ‘output’, namely ‘[s 42, s True]’
|
9 | s …Run Code Online (Sandbox Code Playgroud) 是否可以使用类型族作为高阶"类型函数"传递给另一个类型族?一个简单的例子是以下代码:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Test where
import GHC.TypeLits as T
type family Apply (f :: Nat -> Nat -> Nat) (n :: Nat) (m :: Nat) :: Nat where
Apply f n m = f n m
type family Plus (n :: Nat) (m :: Nat) :: Nat where
Plus …Run Code Online (Sandbox Code Playgroud) 当试图了解GHC程序在信号和异常方面如何工作时,我发现了一个关于“固定”支架的有趣而无定论的讨论。
我很难理解为什么当括号已经掩盖了异步异常时为什么需要进行更改。
在我看来,中断(如POSIX信号中)不是异步异常,或者我在当前长期存在的实现中缺少一些细节:
bracket before after thing =
mask $ \restore -> do
a <- before
r <- restore (thing a) `onException` after a
_ <- after a -- can be interrupted??
return r
Run Code Online (Sandbox Code Playgroud)
以我的理解,after a必须对其进行评估以提供在范围内IO由IOmonad 强制执行的操作mask。
编辑:在主题上时,为什么after在异常情况下不运行两次?
我有一个简单的程序,它仅从用户处获取一个字符串和一个密钥,并使用凯撒密码函数对字符串进行加密。该函数本身起作用,所以我不会显示源代码。问题是,当编译器编译程序时,它将允许我输入所有的getLines,然后在输入所有内容后,程序将打印所有的putStr和putStrLn,然后关闭。仅当使用“ runhaskell”执行程序或将其编译并执行为exe时才发生这种情况。不在口译员中。这是程序:
main = do
choice <- prompt "Would you like to encrypt (1) or decrypt (2)? "
if choice == "1" then do
encrypt <- prompt "Enter code for encryption: "
k <- prompt "Enter key for the code: "
let key = read k in
putStrLn ("Encrypted message: " ++ (caesar key encrypt) ++ "\n")
else do
decrypt <- prompt "Enter code for decryption: "
k <- prompt "Enter key for the code: "
let key = read …Run Code Online (Sandbox Code Playgroud) 由于更新了依赖关系,Haskell程序包(我们称其为程序包A)已停止为我编译,并且出现有关未定义变量的错误。我可以访问一个旧的依赖环境,在该环境中仍可以编译完全相同的代码,因此我可以在GHCi中打开该模块,并使用它:info来跟踪其最初来自何处,从而将我引到B包中。
麻烦的是,A中已损坏的模块无法直接从B导入定义此丢失标识符的模块。它一定是通过另一个将其重新导出的导入获取的。但是在这两种环境之间,A和B都没有改变。因此,这意味着第三个程序包C中的模块必须先前已经从B导入并重新导出了我的标识符,然后才能由A中的损坏模块导入(可能通过进一步的重新导出),并且C在两个环境中不再重新导出标识符。
我可以在工作环境中以某种方式向GHC或Cabal索要完整的进口链,从而导致标识符在范围内,以便我可以识别包装C吗?否则,我不知道如何来缩小问题的原因,而无需手动审查所有的(传递)的依赖关系一个能够从振振有词进口的东西乙。
我正在尝试用 Haskell 编写一个程序,将 ' e'(欧拉数)返回到给定的小数位。到目前为止,这是我的代码:
factorial 0 = 1
factorial n = n * factorial (n - 1)
calculateE a
| a == 0 = 1
| otherwise = nextLevel
where nextLevel = (1 / (factorial a)) + calculateE (a-1)
Run Code Online (Sandbox Code Playgroud)
每当我打电话时,calculateE我只能返回小数点后 16 位。这是 Haskell/我的电脑的限制吗?有没有办法找回任意数量的小数位?