假设有人想在 Haskell 中重新创建标准 POSIX 可执行文件(cat、dd、ls ...)。但 GHC 生成的可执行文件都包含运行时代码。那么,有可能吗
有用于 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 的新手,所以如果这个问题很愚蠢,请原谅。
想象一下,我们有两个绑定到名称x和y 的数据结构。
x是可变的。
y不是。
作为一个问题或原则,x是否一定具有与y不同的类型?
我正在阅读《学习 Haskell 时我希望知道什么》,第 72 页上有这样一句话:
\n\n\n第一定律是,当
\nreturn a传递(>>=)给函数时f,该表达式完全等价于f。
所以我正在尝试这样做:
\nreturn 3 >>= (+ 1)\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n我究竟做错了什么?
\n我想运行 Haskell 程序(主要是编译二进制文件),但我不需要其他程序,我敢说,与编译器一起膨胀。我只想安装编译器并开始编写代码。就像您对 C/C++ 之类的东西所做的那样。您下载 gcc/g++,将其添加到您的路径中,然后就可以开始了。
也许将来当我掌握了这门语言并了解这些构建系统时,我会考虑使用 cabal for Haskell,甚至可能使用 CMake for C/C++。
但实际上我读过/研究过的所有地方都建议安装 GHCup 并安装完整的 Haskell 发行版。如果我只是从他们的官方网站安装 GHC,然后安装其他部分,我会错过一些东西吗?
我知道这感觉像是一个是/否问题,但我在任何地方都没有收到任何令人信服的答案。
任何可能有帮助的建议/帮助或链接将不胜感激。
考虑以下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) fromRational我知道和fromInteger的存在fromIntegral。
但是是否有更通用的函数可以将 any 转换Num为该Double类型?
我还知道这Num是一组类型,并且可能存在使用方式的限制。
但这可能吗?
就像是:
fromNum::(Num a) => a -> Double
Run Code Online (Sandbox Code Playgroud)
最好不要安装任何额外的软件包。
从文档中我倾向于认为,如果我启用扩展DerivingStrategies,我不需要启用GeneralizedNewtypeDerivingor DeriveAnyClass,也不需要启用我当前在\xc2\xa76.6.7.1之前列出的任何其他扩展,例如DerivingVia。
然而,这个玩具示例
\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\nRun Code Online (Sandbox Code Playgroud)\n通过(GHC 9.4.8)编译得很好ghc this-file.hs,但不能通过cabal build(Cabal 3.10.2.1)编译,因为在后一种情况下,还需要我添加
{-# LANGUAGE GeneralizedNewtypeDeriving #-}\nRun Code Online (Sandbox Code Playgroud)\n有什么线索吗?
\nfoo.cabal我正在使用的虚拟文件是
cabal-version: 3.8\nname: foo\nversion: 1.0\n\nexecutable foo\n main-is: main.hs\n build-depends: base\nRun Code Online (Sandbox Code Playgroud)\n mifun s = foldr op 0 s
where op x r = head x + r
Run Code Online (Sandbox Code Playgroud)
有没有办法让ghci告诉我?
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个小时了.我知道这很简单.
ghc ×10
haskell ×10
cabal ×1
ghcup ×1
immutability ×1
list ×1
map ×1
mutability ×1
optimization ×1
runtime ×1
type-theory ×1
typeclass ×1
types ×1