我已经通过 /opt 中的端口安装了 PCRE 库。
我正在尝试安装 PCRE-Light,但cabal install pcre-light报告:
Resolving dependencies...
Configuring pcre-light-0.4...
Preprocessing library pcre-light-0.4...
Base.hsc:103:18: error: pcre.h: No such file or directory
...
Run Code Online (Sandbox Code Playgroud)
pcre.h 位于/opt/local/include
更新:我在链接 macports 提供的 PCRE 库时遇到问题,所以我转而使用 Home Brew。
我不确定我的问题是什么。我有三个模块 A.hs、B.hs 和 C.hs。所有都位于C:\..path...\folder并且模块 B 和 C 都从 A 导入。
也就是说,模块 B 和 C 都包含行 import A
我可以:l C:\..path..\folder\A.hs在 gchi 中玩它的内容;但是,当我尝试:l C:\..path..\folder\B.hs或:l C:\..path..\folder\C.hs
Could not find module `A'
Use -v to see a list of the files searched for.
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)
我觉得这很奇怪,因为我可以轻松地将 B.hs 编译为 B.exe 并运行可执行文件。如何编译和运行无法加载到 ghci 中的模块?或者,为什么在编译时导入成功但加载失败;尤其是当导入的那个模块本身可以加载时?
我们正在编写一个 python 程序,试图合成一个(简单的)haskell 函数给定的输入-输出对。在程序的整个运行过程中,我们生成 haskell 代码并根据用户提供的示例检查其正确性。假设我们得到输入“1 2”和预期输出“3”。我们会(最终)提出加号功能。然后我们将(\x y -> x + y) 1 2在 haskell 中运行
并检查它的计算结果是否为 3。
我们目前做事的方式是运行以下 python 代码:
from subprocess import Popen, PIPE, STDOUT
proccess = Popen(f'ghc -e "{haskell_code}"', shell=True, stdout=PIPE, stderr=STDOUT)
haskell_output = proc.stdout.read().decode('utf-8').strip('\n')
Run Code Online (Sandbox Code Playgroud)
由于我们都不熟悉 ghc、haskell、流程或任何与此相关的任何事情,我们希望有人可以帮助我们以(更)更有效的方式执行此任务,因为这目前非常慢。
此外,我们希望能够执行多个语句。例如,我们想导入 Data.Char 以便我们的函数可以使用“toUpper”。然而,我们目前这样做的方式是发送一个 lambda 函数和附加到它的输入,我们不确定如何在上面添加导入语句(添加“\n”似乎不起作用)。
总而言之,我们想要最快的(运行时)解决方案,它允许我们从 python 测试 haskell 函数(我们没有提前或在某个时间点的所有 haskell 函数的代码,而是在生成时进行测试)代码),同时允许我们使用多个语句(例如,导入)。
抱歉,如果其中任何一个是微不足道的或愚蠢的,任何帮助将不胜感激。
我目前正在阅读“从第一原理开始的Haskell编程”,关于底部的一节中有一段内容如下:
让我们研究一些使我们的程序深入人心的方法:
Run Code Online (Sandbox Code Playgroud)Prelude> let x = x in x***例外:<<循环>>
在这里,GHCi检测到x中的x = x永不返回,并且使永无休止的计算短路。这是一个示例,因为它永远不会返回结果。请注意,如果您使用的是Windows计算机,此示例可能会冻结GHCi,并且不会引发异常。
我的问题是:Windows是否有任何内在因素使得不可能或很难检测到此循环,或者它仅适用于GHC(i)实现?
如何从stack生成的框架(stack new myprog simple)创建可执行文件?myprog.cabal然后显示myprog为可以使用执行的可执行文件stack exec myprog。但是:使用./myprog将不起作用。除非我打电话给我ghc --make src/Main.hs。显然,这可以正常工作并且很好地嵌入了模块,但是现在可执行文件称为Main。有没有一种方法可以将其stack编译myprog为完整的可执行文件,并且可以在设置了环境路径的情况下从任何地方调用?
Haskell 具有挑战性!到目前为止我想到的是,我可以执行以下操作来模拟 Haskell 中的 for 循环以从用户那里获取数字列表:
myList <- sequence [putStr "Enter an integer: " >> (
\s -> read s :: Int) <$> getLine | t <- [1..5]]
Run Code Online (Sandbox Code Playgroud)
伟大的!所以myList包含我输入的五个整数。伟大的!但问题就在这里。而不是迭代五次(或任何有限次数)的 for 循环如何将上述内容转换为等效的 while 循环?
所以我在想的是这个,但不幸的是它不起作用。有什么“神奇”的方法可以让它发挥作用吗?
takeWhile (\x -> x > 0) $ sequence [putStr "Enter an integer: " >> (
\s -> read s :: Int) <$> getLine | t <- [1..]]
Run Code Online (Sandbox Code Playgroud)
问题在于它(\x -> x > 0)适用于 Int。(或任何 Num 类型。)但是来自该列表的实际上是一堆 IO Int。 x > 0返回一个布尔值。我需要一个返回 IO …
我正在学习 FP 并且在玩过 GHCi 后有一些困惑。
假设我有两个简单的功能:
twice :: (a -> a) -> (a -> a)
twice f a = f (f a) -- Equation 1
double :: Int -> Int
double = \x -> x * 2
Run Code Online (Sandbox Code Playgroud)
分解评估twice twice twice double 3(注意 3x twice+1x double),我会:
{-
twice twice twice double 3
== (twice twice twice double) 3
== (twice twice (twice double)) 3
== (twice (twice (double double 3)))
== (twice ((double double) (double double 3))) …Run Code Online (Sandbox Code Playgroud) 我已经尽我所能搜索了 ghc 用户手册,但我一直无法找到一种方法让 ghc 在编译时打印每个模块的时间。
我是 Haskell 的新手,从第一性原理开始阅读 Haskell,在第 384 页的折叠章节中,我遇到了FoldR,似乎它不是尾递归的
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr f z [] = z
foldr f z (x:xs) = f x (foldr f z xs)
Run Code Online (Sandbox Code Playgroud)
1-我们可以让它尾递归吗?
2-它会被优化吗?
我想知道是否可以创建一个数据构造函数,而不是采用特定类型可以采用任何给定类。
所以代替
data Container = ContainerI Int | ContainerF Float
Run Code Online (Sandbox Code Playgroud)
就像是
Container::(Num a)=>a
data Container = Container a
Run Code Online (Sandbox Code Playgroud)