我正在制作一个函数,使用累加器连接列表的三元树
19 data Ttree t = Nil | Node3 t (Ttree t) (Ttree t) (Ttree t)
20
21 acc :: Ttree [a] -> [a]
22 acc tree = acc' tree []
23
24 acc' :: Ttree [a] -> [a] -> [a]
25 acc' Nil rest = rest
26 acc' (Node3 xs l m r) r
所以我得到了这个
intCMP :: Int -> Int -> Ordering
intCMP a b | a == b = EQ
| a < b = LT
| otherwise = GT
intCMPRev :: Int -> Int -> Ordering
intCMPRev a b | a == b = EQ
| a < b = GT
| otherwise = LT
floatCMP :: Floa
在函数式编程中,一个非常通用的函数是什么样子的
有人说“我们没有对象,但我们有高阶函数”。高阶函数是否替换对象
在编写面向对象的应用程序时,我多次尝试从一个更一般的想法转到一个更详细的想法。如果我在函数式编程中尝试这样做,我会需要很多高阶函数吗?这个答案是面向Haskell而不是Lisp的,因为尽管Lisp有高阶函数,但惯用Lisp可以而且通常非常面向对象
我们还将忽略继承(和特殊多态性),这通常与面向对象编程相关,但在某种程度上是正交的
一般来说,抽象数据类型“替换”对象,也就是说,通常在Ja
我想做一个函数,如果给定路径上的值等于ND(无数据),我可以向树中添加一个新值,这是我第一次尝试
它检查值等,但问题是,我想能够打印修改后的树与新的数据。有人能给我指点吗?我还试着做了第二个函数来检查路径,看看是否可以添加数据,但我只是不知道如何打印修改后的树?我不是Haskell方面的专家,但函数编程只适用于函数。所以任何东西都是函数。
现在,函数接受一些输入并返回一些内容,而不是修改输入。您必须将返回的树保留在某个位置,这将是您的新树,其中包含插入元素的树我们确实需要查看路径和错误数据类型来
我无法编译以下代码:
main = do
line <- getLine
putStrLn (work (toInt line) [0,0,0])
work n b = do
if n == 0
then
unwords (map show b)
else do
line <- getLine
work n-1 summ (map toInt . unwords line) b
toInt ::
我想这样做:
data Foo n = Foo $(tuple n Integer)
从而允许
x :: Foo 3
x = Foo (1, 2, 3)
y :: Foo 5
y = Foo (5, 4, 3, 2, 1)
目前我只是
data Foo = Foo [Integer]
可以使其工作,但会丢弃许多良好的编译时检查。我将创建几个不同的Foo数据对象,每个对象在其整个生命周期中都有固定数量的Foo,如果不能在类型系统中检查这一点,那就太傻了
这在哈斯克尔可能吗?怎么样
data
我试图修改数据库列表中的一个元素以添加到评级中,我想返回一个包含新元素的修改后的数据库。我知道哈斯凯尔有不可改变的东西,但同时我也不太明白怎么做
以下是类型:
data Film = Film Director Title Year Ratings
deriving (Show,Ord,Eq, Read)
testDatabase :: [Film]
我仅有的代码是:
--addRating :: Rating -> Film -> Film
--addRating r
我目前正在尝试创建一种嵌入Haskell的(某种)类型安全的xml语法。最后,我希望实现这样的目标:
tree = group [arg1 "str", arg2 42]
[item [foo, bar] []
,item [foo, bar] []
]
data Bar = Bar Int | DefaultBar
example = Group (StringArg "str") (IntArg 42)
[I
问题在于过滤器(
我想把一个一元值转换成另一个一元类的一元值
假设我有一个实例声明:
instance ClassM TypeT where
funcX = abc >>= \x -> return (x)
ClassM:是一个自己定义的monad类
TypeT:是一种自己定义的类型/数据,具有monad实例实现
abc:属于IO a型
如何转换abc::IO a的一元值
到classM m=>MA的一元值
又称m1 a->m2 a(其中m1不是m2)(例如:IO 5-
我在和哈斯克尔学习
这是签名。解决问题的办法是:
sequenceIO :: [IO a] -> IO [a]
sequenceIO [] = return []
sequenceIO (a:as) = do {v <-a ; vs <- (sequenceIO as) ; return (v : vs)}
sequenceIO::[IO a]->IO[a]
sequenceIO[]=返回[]
sequenceIO(a:as)=do{v你的解决方案不起作用的原因是你不能简单地
我提出两点。
现在,我需要检查这些点是否相同,所以我要:
type datatypePoint = (Float,Float)
anyLine :: datatypePoint -> datatypePoint -> datatypeLine
anyLine a b = [[fst a, fst b] , [snd a, snd b]]
| (fst a == fst b) && (snd a == snd b) = error "Identical"
我已经升级到ghc-7.6.3,现在我很难安装阴谋集团,它在接近尾声时就失败了。模块使用ghc编译并正常运行
错误是:
阴谋集团:错误的接口文件:dist/build/Sync.hi
接口文件版本不匹配(通缉“7063”,通缉“7042”)
我们将不胜感激
谢谢
N
更新:
感谢您的建议-错误实际上更简单。出于某种原因,我注释掉了文件顶部的模块声明——因此build/dist目录中只有名为Main not Sync的文件。我想知道这些错误消息是否能说明这一点
以下是cabal安装-v的输出:
我想知道是否可以为Bool编写自己的replicItem实现
没有导入Monad模块的值?当我查看Haskell源代码时,它看起来确实很复杂,但我想知道该函数是如何工作的,它应该是什么样子。实现replicateM的一种方法是:
replicateM n = sequence . replicate n
这有助于你的理解吗?当然,棘手的部分在于序列的操作,它有以下有趣的类型:
sequence :: Monad m => [m a] -> m [a]
因此,
replicateM
我正在尝试cabal安装wxHaskell的一个组件(Haskell平台2013.2与wxWidgets 3.0)。
我能够从mingw.org用32位mingw编译git版本。但最终,安装的wx无法正常工作,运行一个最小的示例会在wxc.dll中出现运行时异常。因此,我尝试在TDM-GCC4.8.164bit下编译相同的东西,因为wxWidgets人员以TDM-GCC编译的二进制文件的形式提供二进制文件
但我告诉我,TDM-GCC立即遇到了编译错误
错误:“strnlen”未在此作用域中声明
我正在尝试编写一些在haskell中具有参数的函数
例如:我创建了一个包含各种颜色的列表,但我希望函数只从列表中获取橙色,如何在函数中指定此颜色
getColor :: a -> a
getColor = orange
您需要一个函数,该函数接受多种颜色的列表并返回单一颜色(可能是您自己选择的)。您应该从表示颜色的数据类型开始
data Colour = Red | Orange | Yellow | Green | Blue
现在,您需要一个具有以下类型的函数getcolor
get
我正在尝试使用Keter部署Yesod应用程序。我以前在/opt/keter/incoming中添加了一个*.keter捆绑包,但由于我在不同的系统上构建了该文件,因此无法启动。此后,我通过在服务器上构建我的应用程序来解决这个问题
但是,现在当一个新的*.keter包被添加到/opt/keter/incoming/时,什么也不会发生/opt/keter/log/keter/current.log自第一次部署失败后,没有任何日志消息。当我运行ps aux | grep kete[r]时,我看到几个
对于学校编程练习,我被要求在modify方面实施get和put,在get和put方面实施modify。因此,我一直在困惑几个堆栈溢出的职位和其他材料,以把碎片在一起。这就是我到目前为止所做的
class Monad m => MonadState m s | m -> s where
get :: m s
get = modify id -- (\s -> s)
put :: s -> m ()
put s = do
我有一个我不太了解的System F plymorphism的例子:
如果我删除这些类型,它将保留:
\f、 \a.f(f a)这毫无意义
你能帮我吗?
谢谢大家! 删除的术语确实有意义:在Haskell中,它将是\f a->f(f a),一个相当普通的函数,将其第一个参数应用于第二个参数,然后再应用于结果
\f a->和\f.\a之间的区别只是其中一种表示法。如果愿意,可以编写Haskell术语\f->\a->f(fa),它是等效的,但在语法上更接近已擦除的系统f
(请注意,double不是
我有下面的代码,应该是™ 将excel列类型转换为相应的编号。例如,AA分为27,AB分为28:
import Data.Char (ord)
import Data.List (foldl1')
columnToNumber :: String -> Int
columnToNumber s = foldl1' (\acc (i, v) -> acc + 26 ^ i * v) (values s)
where values s = zip (reverse [0..(len
我正在阅读《Haskell从第一原理编程》一书,在其中一个建议的练习中,作者要求我们编写一个类TooMany for(Num a,TooMany a)=>(a,a)的实例,如果两个数字之和大于42,则应进行比较
这是我的密码:
class TooMany a where
tooMany :: a -> Bool
instance TooMany Int where
tooMany n = n > 42
instance (Num a, TooMany a) =>
如果在深度镜头查找/分配过程中未遇到任何问题,是否可以设置默认值
例如,对于查找:
(Just (4, 3), 2) ^. _1 . (maybe (6, 5)) . _1 == 4
(Nothing, 2) ^. _1 . (maybe (6, 5)) . _1 == 6
或者更重要的是,对于任务:
((Just (4, 3), 2) & _1 . (maybe (6, 5)) . _1 .~ 7) == (Just (7, 3), 2)
((Nothing, 2)
我在Haskell做作业,我需要一个元素一个元素地比较两个列表,并计算有多少元素是相同的,在同一个地方:第一个列表的第一个元素和第二个列表的第一个元素,等等
以下是我所拥有的:
compare :: [Int]->[Int]->Int
compare [a] [b]= if head a == head b then 1 + compare (tail a tail b) else 0 + compare (tail a tail b)
compare [] [b] = 0
我事
我想做一个函数,检查每一行的电路板是否是红色的,一次一行,但从概念上讲,我很难做到这一点。起初,我用所有蓝色方块制作电路板,但一旦用翻转功能翻转方块,allRed功能应该能够判断行是否全部为红色。每一行由蓝色或红色的颜色列表表示
我知道我应该使用all函数,但我在实际编写时遇到了一些问题
以下是我到目前为止的情况:
generateboard :: Int -> [[Color]]
generateboard n = replicate n (replicate n Blue)
all
为什么这会给我错误
insertAt :: Int -> a -> [a] -> [a]
insertAt n x xs = x1 ++ x ++ x2
where (x1,x2) = splitAt n xs
您正在混合列表和列表元素-您必须将元素打包到一个单例列表中
insertAt :: Int -> a -> [a] -> [a]
insertAt n x xs = x1 ++ [x] ++ x2
where (x1,x2) = sp
我正在一个网站上工作,为了省去私人数据库的麻烦,我决定使用GoogleAPI对用户进行身份验证。我跟着导游走。我复制了代码,但当我运行它并尝试登录时,我会在谷歌屏幕上选择要登录的帐户。我选择了我的账户,然后它持续加载了很长一段时间(我把它保留了半个小时,没有任何变化)。此外,应用程序开始消耗我的ram(它使用我16GB的所有内存)
我不确定哪里出了问题。也许以前有人遇到过这种事
干杯
编辑:
以下是我使用的代码:
{-# LANGUAGE MultiParamTypeClasses #-}
{-
我以前创建过这个函数来生成范围(m,n)内的整数和随机数
在这种情况下,我希望使用相同的参数多次运行它,这样它将返回给定范围内随机生成的值列表。我尝试了复制函数,但它只复制了giveRand的结果。它没有创建函数的多个副本并重新评估它
从这个问题中,我想知道是否有一个函数允许我使用相同的参数多次运行任何函数。我问这种情况,比如这个,即使输入相同的范围,可能会出现不同的值
那么,Haskell中是否有任何函数可以让我使用相同的参数多次运行函数?忘记unsafePerformIO;承认你在做有状态的
我为一副牌定义了数据套装和数据值。我还定义了类型Card和类型Deck。但我不知道如何使用它们
data Suit = Club | Diamond | Heart | Spade
data Value = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten |
Jack | Queen | King | Ace
type Card = (Suit, Value)
type Deck = [Card]
有人能给我
遵循此树数据类型的定义
data Tree = Leaf Int | Node Int Tree Tree
定义与图表对应的Tree类型的值
0
1 2
3 4 5 6
t:树
t=
我对构造函数叶与节点有些困惑。以及问题的确切结构。有一个构造函数节点创建了一个有两个树分支的节点,还有一个只创建了一个叶节点,对吗?这是否意味着在我们的定义中,使用“leaf”的唯一时间是在末尾,而在开始时调用node
t = Node '0'
(Node '
我想知道使用大量交换空间运行ghc是否是个好主意,或者是否可行。我的工作负载中,大部分数据99%的时间处于空闲状态。在任何给定的时间,实际上都在积极使用一组非常小的数据。这听起来是让内核交换内存的最佳时机,但gc通常是个问题。不过,Haskell只有不可变的值,所以理论上它可以工作
ghc运行时是否读取旧值,迫使我在每个gc或其他东西上交换入/出,或者我是否可以期望不接触的内存不会被交换入
请随意编辑标题,我想不出一个合适的描述。GHC使用复制采集器,将活动/可访问数据树复制到一个新区域,这意味
我是Haskell的新手,我正在尝试映射一个检查函数,该函数检查文件是否存在,如下所示:
check::FilePath->IO Bool
从Main到argv,如下所示:
main :: IO Bool
main = do {
args <- getArgs;
return $ foldM (&&) True $ mapM check args;
}
main::IO Bool
main=do{
args Bool->m0 Bool
实际类型:Bool-
我正在尝试使用波阵面obj包来读取obj文件。这是
下载此文件后,我会
import Data.WaveFrontObj
x <- loadWavefrontObj "pinecone.obj"
然后:
看起来结果是空的。我做了什么坏事?看起来你的OBJ文件有一些波前OBJ无法识别的指令。您可以看到,波前obj只理解、v、vt、vn和f指令。您的文件以mtllib和o指令开始,并且似乎有几个其他指令不在支持列表中
因此,先验地,我希望得到的结果是左而不是右。但是波阵面obj的作者陷入了一
我有一个multiparam typeclass,它提供了一个函数,可以交换其参数:
class Swappable a b where
swappable :: a -> b -> Bool
因此,如果a和b形成可交换的ab,那么b和a应该形成可交换的ba。为每个普通实例编写一个交换实例将是一件烦琐的事,所以我天真地写了
instance Swappable a b => Swappable b a where
swappable b a = swappab
假设情况如下:
data Foo a = Foo
type family AlwaysInt a where
AlwaysInt (Foo a) = AlwaysInt a
AlwaysInt _ = Int
我想证明,在a中总是Int
import Data.Type.Equality
lemma :: AlwaysInt a :~: Int
lemma = undefined
我如何证明这一点?我想对类型族定义中的每种类型进行“模式匹配”,因为我可以证明每种情况下
每当我尝试使用堆栈安装某些东西时,例如$stack install hip,$stack install Gifcurry,以及其他几个软件包,它们都会抛出相同的错误:
Downloaded lts-12.9 build plan.
AesonException "Error in $.packages.cassava.constraints.flags['bytestring--lt-0_10_4']: Invalid flag name: \"bytestring--lt-0_10_4\""
我对Haskell(和编程)很陌生。
我的任务是定义一个函数,它返回一整副卡片(又称52张卡片)。试图在代码旁边的注释中包含我的思维过程
--我定义的值
data Suit = Club | Diamond | Heart | Spade deriving (Show, Enum)
data Value = Two | Three | Four | Five | Six | Seven
| Eight | Nine | Ten | Jack | Queen
我正在自学Haskell使用CIS194spring13。今天,当我试图处理作业4练习1时,我犯了一个错误
fun1' :: [Integer] -> Integer
fun1' = foldl' (*) 1 . map (-2) . filter even
据说:
error:
? No instance for (Num (Integer -> Integer))
arising from a use of syntactic negation
我不理解下面代码的简单类型错误
addCustom :: Num a => a -> a
addCustom a = a + 1.2
它抛出
无法从文字“1.2”推导出分数a
我不知道为什么 您必须将分数a添加到a的上下文中
应该有用
如果启动ghci并查看1.2的类型,您将看到
(1.2) :: Fractional p => p
而+的类型是
这表示该函数可以应用于属于类型类Num的对象
因此,虽然a->a是函数的类型,但它没有分数上下文。仅限Num
这就是为什么添加上
我在尝试编译静态Haskell可执行文件时遇到以下错误:
/usr/bin/ld.gold: error: /usr/lib/gcc/x86_64-linux-gnu/6/crtbeginT.o: requires dynamic R_X86_64_32 reloc against '__TMC_END__' which may overflow at runtime; recompile with -fPIC
collect2: error: ld returned 1 exit status
当前我的default.nix看起来像:
{
sources ? import ./nix/sources.nix
, compiler ? "ghc865" } :
let
niv = import sources.nixpkgs {
overlays = [
(_ : _ : { niv = import sources.niv {}; })
] ;
config = {};
};
pkgs = niv.pkgs;
myHaskellP
我正在用blaze html库编写一个web应用程序。
静态内容生成时没有问题,但我坚持生成动态内容
-- compiles, runs but expanded into empty string
forM_ [1,2,3] (\x -> return $ (H.p . H.toHtml . show) x)
看来这次bug潜入了Haskell类型检查器
我的调查
:t forM_
forM_ :: (Foldable t, Monad m) => t a -> (a -
如何为具有签名的集合实现foldr函数:
(a -> b -> b) -> Set a -> b -> b
而不是
(a -> b -> b) -> b -> Set a -> b
在哪里
data Set x=Node | Tree x(Set x)(Set x)您可以根据原始函数定义新函数(请注意,这不是特定于Set;这适用于具有可折叠实例的任何类型构造函数)
换句话说,新函数就是由foldr组成的flip与其他签名的组成方式相
到目前为止,我编写了以下代码,我测试了所有函数,它们工作得很好,但是测试indexNodesM函数,它就是不工作,我认为put方法工作不正常
给定的测试用例是:
execState (indexNodesM exTree1) 0 == 6
evalState (indexNodesM exTree1) 0 == Node (5,3) (Node (3,1) Leaf (Node (2,11) (Node (0,7) Leaf Leaf) (Node (1,5) Leaf Leaf))) (Nod
我是Haskell的新手,希望在do块中执行递归
countLines :: String -> IO Int
countLines filePath = do
isFile <- doesFileExist filePath
if isFile
then do contents <- readFile filePath
print contents
pure 0
e
我在寻找本质上与此相反的东西,我已经疯了
在字符串中,可以反转下面的参数来检查列表中的任何元素
而不是:
any(isInfixOf“Hask”)[“我是”、“新来的”、“Haskell”]
我需要:
any(isInfixOf[“我是”、“新来的”、“哈斯克尔”)“我是新来的”
感谢您的帮助 您可以使用lambda表达式将其编写为:
any (\x -> isInfixOf x "I am new to") ["I am", "new t
标签: Haskell
boolean-expressionside-effects
我希望每个人都安全
我正在学习Haskell,发现Haskell中的函数没有副作用。我只是想知道在命令式语言中,布尔表达式被认为是没有副作用的表达式,因为它们只返回true或false(它们的主要作用)
谢谢 在命令式语言中,表达式通常会有副作用。例如,在Python中:
def f(x):
print(x)
return True
if f(2) or f(4):
print(3)
def(x):
打印(x)
返回真值
如果f(2)或f(4):
打印(3)
因此,它在
我正在尝试将和repos结合起来,以便能够更改这两个版本的源代码,同时具有针对VSCode的Haskel扩展的优点(关于hover和autocomplete的文档)
我在回答我的问题时使用了我自己描述的两种方法。我能够使用pandoc类型作为本地依赖项,使用cabal build和stack build成功编译我的代码
如上面链接中所述,为了向堆栈项目添加本地依赖项,需要更改以下文件:
flags:
pandoc:
trypandoc: false
embed_data_fi
标签: Haskell
type-inferencelambda-calculusapplicativehindley-milner
我正在通过锻炼来学习哈斯克尔。我的路有个街区。我不知道Haskell是如何推断出lift2()(,)的类型,并得出函子k=>(a1->ka2)->a1->k(a1,a2)
我已经试用了lift2()的类型,并通过GHCI的命令:t lift2()进行了验证。步骤如下。
我知道lift2::Applicative k=>(a->b->c)->ka->kb->kc
我还知道:函子f=>(m->n)->(fm)->(fn)
然后通过lambda演算的Beta转换,我可以计算出lift2()的类型是
(
命令install、v1 install、v2 install和new install在运行man cabal时被简单描述为“安装软件包”。它们彼此不同吗?哪个是首选选项?对于cabal安装的版本,是相同的v1安装和其他v1-命令已过时,不应再使用
请注意,在开发cabal软件包时,install命令基本上是不必要的。正在运行并将自动安装所需的依赖项(在的部分中列出)
阴谋集团安装在以下情况下仍然有用:
从包安装可执行文件。与包中的warp可执行文件类似。在这些情况下,选项--overwrit
尝试在Haskell中的用户定义数据上派生show时,出现内存不足错误。原因是什么
--ghc 8.0.2
class X a where
f::a->a
f a = a
data T = AA | BB
instance X T
instance Show T
var::T
var = AA
main = print $ var
我从Haskell那里期望制作X级和Show级的T instacne,并因此打印AA。实例函数在类X(实例X T)上工作,但在