标签: ghc

GHC 可执行文件可以共享运行时代码吗?

假设有人想在 Haskell 中重新创建标准 POSIX 可执行文件(cat、dd、ls ...)。但 GHC 生成的可执行文件都包含运行时代码。那么,有可能吗

  • 在多个可执行文件之间共享运行时代码并使它们更小且加载速度更快?
  • 每个系统使用一个垃圾收集器?(不确定这是否是好的优化)

optimization haskell runtime ghc

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

如何在 Haskell 中操作未装箱的类型

有用于 Int、Float 等的未装箱类型 GHC。我知道在它们上构建的代码运行时开销较少,但我没有看到如何向基于未装箱 Int 的函数输入和输出数据的方法,即

GHC.Exts 定义了函数 (+#) 和 (*#),但我找不到函数 boxing/unboxy

  readInt:: String -> Int#
  showInt:: Int# -> String

  boxInt :: Int# -> Int
  unboxInt :: Int -> Int#
Run Code Online (Sandbox Code Playgroud)

实例 Show Int# 和实例 Read Int# 不能存在,因为显示和读取是多态的。

如果没有这些功能,我如何将未装箱类型上的优化代码块与应用程序的其余部分集成?

haskell ghc

3
推荐指数
2
解决办法
622
查看次数

在 Haskell 中,可变性是否总是必须反映在类型系统中?

我是 Haskell 的新手,所以如果这个问题很愚蠢,请原谅。

想象一下,我们有两个绑定到名称xy 的数据结构。

x是可变的。

y不是。

作为一个问题或原则,x是否一定具有与y不同的类型?

haskell type-theory immutability ghc mutability

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

为什么我没有因使用“it”而得到 (Num (m0 b0)) 的实例

我正在阅读《学习 Haskell 时我希望知道什么》,第 72 页上有这样一句话:

\n
\n

第一定律是,当return a传递(>>=)给函数时f,该表达式完全等价于f

\n
\n

所以我正在尝试这样做:

\n
return 3 >>= (+ 1)\n
Run Code Online (Sandbox Code Playgroud)\n

我得到

\n
    No instance for (Num (m0 b0)) arising from a use of \xe2\x80\x98it\xe2\x80\x99\n    In a stmt of an interactive GHCi command: print it\n
Run Code Online (Sandbox Code Playgroud)\n

我究竟做错了什么?

\n

haskell ghc

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

为 haskell 安装 GHCup 与 vanilla GHC

我想运行 Haskell 程序(主要是编译二进制文件),但我不需要其他程序,我敢说,与编译器一起膨胀。我只想安装编译器并开始编写代码。就像您对 C/C++ 之类的东西所做的那样。您下载 gcc/g++,将其添加到您的路径中,然后就可以开始了。

也许将来当我掌握了这门语言并了解这些构建系统时,我会考虑使用 cabal for Haskell,甚至可能使用 CMake for C/C++。

但实际上我读过/研究过的所有地方都建议安装 GHCup 并安装完整的 Haskell 发行版。如果我只是从他们的官方网站安装 GHC,然后安装其他部分,我会错过一些东西吗?

我知道这感觉像是一个是/否问题,但我在任何地方都没有收到任何令人信服的答案。

任何可能有帮助的建议/帮助或链接将不胜感激。

haskell ghc ghcup

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

当我们无论如何都可以解决限制时,为什么不能部分应用类型族/同义词?

考虑以下Map类型函数:

type Map :: (k1 -> k2) -> [k1] -> [k2] 
type family Map f l where
  Map _ '[] = '[]
  Map f (x : xs) = f x : Map f xs
Run Code Online (Sandbox Code Playgroud)

然后我可以定义:

type MkPair a = (a, a)
Run Code Online (Sandbox Code Playgroud)

并尝试执行以下操作:

type Blah = Map MkPair [Int, Char]
Run Code Online (Sandbox Code Playgroud)

但我发现类型同义词不能部分应用。

但我可以做这个稍微迂回的路线:

type Mapper :: k1 -> k2 -> Type
data Mapper k1 k2 where
  Mapper :: Type -> Mapper k1 k2

type MapF :: Mapper k1 k2 -> …
Run Code Online (Sandbox Code Playgroud)

haskell types ghc type-families

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

在 Haskell 中将 Num 转换为 Double

fromRational我知道和fromInteger的存在fromIntegral
但是是否有更通用的函数可以将 any 转换Num为该Double类型?
我还知道这Num是一组类型,并且可能存在使用方式的限制。
但这可能吗?
就像是:

fromNum::(Num a) => a -> Double
Run Code Online (Sandbox Code Playgroud)

最好不要安装任何额外的软件包。

haskell ghc

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

如果我显式启用 DerivingStrategies,为什么 Cabal 与 GHC 不同,不会自动启用 GeneralizedNewtypeDeriving?

文档中我倾向于认为,如果我启用扩展DerivingStrategies,我不需要启用GeneralizedNewtypeDerivingor DeriveAnyClass,也不需要启用我当前在\xc2\xa76.6.7.1之前列出的任何其他扩展,例如DerivingVia

\n

然而,这个玩具示例

\n
{-# LANGUAGE DerivingStrategies #-}\n\nnewtype MyNum = MyNum Int\n deriving stock (Eq, Ord, Show, Read)\n deriving newtype (Num, Enum, Real, Integral)\n\nmain :: IO ()\nmain = print $ MyNum 0\n
Run Code Online (Sandbox Code Playgroud)\n

通过(GHC 9.4.8)编译得很好ghc this-file.hs,但不能通过cabal build(Cabal 3.10.2.1)编译,因为在后一种情况下,还需要我添加

\n
{-# LANGUAGE GeneralizedNewtypeDeriving #-}\n
Run Code Online (Sandbox Code Playgroud)\n

有什么线索吗?

\n
\n

foo.cabal我正在使用的虚拟文件是

\n
cabal-version:   3.8\nname:            foo\nversion:         1.0\n\nexecutable foo\n    main-is:          main.hs\n    build-depends:    base\n
Run Code Online (Sandbox Code Playgroud)\n

haskell typeclass ghc cabal language-extension

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

Haskell:这个函数的类型是什么?

mifun s = foldr op 0 s
          where op x r = head x + r 
Run Code Online (Sandbox Code Playgroud)

有没有办法让ghci告诉我?

haskell ghc

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

使用Map应用具有多个输入的函数?(Haskell的)

G'day伙计们,

目前正在尝试完成我正在做的一些功课,并且遇到一个问题我正在尝试在接受多个输入的函数中应用地图.

所以在我使用processList f(x:xs)= map acceleList f xs x xs的情况下

processList被赋予一个浮点值(f)和一个List,它将它分类到另一个List中

Accelerate List采用浮点值(f)List和List Object,通过它返回另一个List Object

我知道我的加速列表代码是正确的,但我不能为我的生活得到这个代码的语法工作:

processList :: Float -> [Object] -> [Object]
accelerate f [] = []
accelerate f [x] = [(accelerateForce f x x)]
accelerate f (x:xs) = map accelerateList f xs x xs
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我现在已经摸不着头脑约3个小时了.我知道这简单.

haskell list map ghc

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