在大多数功能语言(包括Haskell )中,定义链接列表类型本身是简单的:
data List a = Nil | Cons a (List a)
但是,我在Haskell教程中找不到显示如何定义自己的数组类型的教程。如何定义数组数据类型,就像我们从无到有地定义自己的列表一样?
Note:我的问题不是如何在Haskell中使用数组,而是理论上如何定义自己的数组类型,就像为List所做的那样,而不使用任何类型的库或内置功能。
我正在尝试用Haskell编写一个简单的迭代算法,但我正在努力寻找优雅和速度方面的最佳解决方案。
我有一个算法,它需要在多次迭代中对一个状态应用操作,直到达到某个停止条件,使用某个任意函数记录该状态。我已经知道如何通过定义像iterateM这样的函数来实现这样的方案。
但在这种情况下,为每个步骤执行的操作取决于状态,并归结为检查“步骤类型”条件以决定下一个迭代类型,然后为下10个迭代执行操作A,或在再次检查条件之前为下一个迭代执行操作B。
我可以用命令式的方式来写它:
c=0
while True:
if c>0:
x=iterateByA(x)
在Haskell中,如何有效地将无限列表的最后一项与有限列表连接起来?
last不工作,它显然是从头部迭代的,因此以下内容永远不会完成:
-- let's have a list of all natural numbers,
-- with zero appended
arr = [1..] ++ [0]
-- it was fast! now get the last item, should be easy
res = last arr
编辑:我想知道Haskell对[1..] ++ [0]的内部表示是什么,最初是“完全未评估”吗?如果它将内部表示为由两个(未评估的)列表组成的“
据我所知,范畴的典型解释是,该范畴的对象是Haskell类型,而态射是Haskell函数。
根据这一解释:
{-# LANGUAGE DataKinds, TypeOperators, TypeFamilies #-}
data Nat = Z | S Nat
type family Map (f :: Nat -> Nat) (x :: [Nat]) :: [Nat] where
Map f '[] = '[]
Map f (x ': xs) = (f x) ': (Map f (xs))
我们可以将Z解释为Hask的单个对象子范畴,将S a解释为函子
作为一项培训,我编写了一个多态函数,以确定给定的数字是否是单个数字或所有数字列表的素数:
{-# LANGUAGE FlexibleInstances #-}
class PrimeTo a where
ispt :: Integer -> a -> Bool
instance PrimeTo (Integer) where
ispt n d = 0 /= (rem n d)
instance PrimeTo ([Integer]) where
ispt n [] = True
ispt n (x:xs) = (ispt n x) &&
据我所知,函子是两个类别之间的映射,例如
中的对象
哪里
和
都是类别。
在Haskell中有Hask,其中对象是Haskell类型,而态射是Haskell函数。但是,Functor类型类有一个函数fmap,它在这些类型之间映射(因此是对象,而不是类别本身):
fmap :: (a -> b) -> f a -> f b
f a和f b都是Hask中的对象。这是否意味着Haskell中的每个Functor实例都是一个函数,如果不是,Functor是否真的表示一个函子?
我在这里错过了什么?类型也在Haskell中吗?
,我的问题是:如何在Matlab中执行类似于Haskell或Python的列表理解?要在Matlab中完成以下功能:
for xxx
if condition
expression1;
else
expression2;
end
end
,我最初的目标是利用矢量化的操作,减少代码中的for-循环,使其运行得更快。
编辑:我对答案的期待不是必要的,与数组相关的东西,矢量操作方法更受欢迎。
还有一个与这个问题相关的问题(通过名为“arrayfun”的函数)。Matlab中的匿名函数只缝1行,那么我如何在其中写if-if表达式
我正在尝试更改haskell中的列表,使每个元素之间都包含0。如果我们有初始列表[1..20],那么我想将其更改为[1,0,2,0,3..20] 我想要做的实际上是在每个函数上使用映射,提取元素,然后将其添加到列表中,并使用++[0],但不确定这是不是正确的方法。仍在学习haskell,因此可能会有错误。 我的代码: x = map classify[1..20]
classify :: Int -> Int
addingFunction 0 [Int]
addingFunction :: Int -> [a] -> [a]
addingFunction x xs
我正在学习Haskell。
我正在尝试查找列表as的元素,这些元素与列表bs的元素相加,并以元组的形式返回这些元素:
findSum2 :: [Int] -> [Int] -> [(Int,Int,Int)]
findSum2 as bs = [(a, a', b) | a <- as, a' <- as, b <- bs, a + a' == b]
代码起作用了。但为了学习Haskell,我尝试将其重写为do-notation:
findSum2 :: [Int] -> [Int] -> [(Int,Int,Int)]
fin
为什么Haskell实现如此关注链接列表?
例如,我知道Data.Sequence在大多数列表操作( cons操作除外)中效率更高,并且经常使用;不过,从语法上讲,它“几乎不受支持”。Haskell在函数式抽象和可折叠类等功能抽象方面投入了大量精力,但它们的语法与默认列表的语法不兼容。
如果在一个项目中,我想优化并用序列替换我的列表--或者如果我突然想要支持无限集合,并用列表替换我的序列--那么产生的代码更改是令人厌恶的。
因此,我想我的疑惑可以在以下几个问题中得到具体体现:
为什么map的类型不等于(Functor f) => (a -> b) -> f a ->
嗨,我是Haskell编程的新手。我正在尝试自己实现运算符"++“。下面是我编写的一个小程序,但它无法工作:
append (es:e) xs =
if (null es)
then e:xs
else append es (e:xs)
我收到了许多与a,[a]和[a]的类型错误。Haskell中的列表类型仍然令人困惑。有人能帮我吗?谢谢。:)
就在最近,我开始尝试haskell。尝试不同的练习很有趣,但有时我觉得我找到的解决方案一点也不优雅:下面的Code Snipplet将在列表中找到最长的子序列,它将满足给定的条件(例如大写字母等)。
你能帮助菜鸟把每件事变得更短更优雅吗?我们非常感谢你的每一个建议。
import Data.Char
longer :: [a] -> [a] -> [a]
longer x y = if length x > length y
then x
else y
longest :: [[a]]->[a]
在学习haskell时,我无法理解haskell是如何自动匹配列表头被提取的模式的。
head' :: [a] -> a
head' [] = error "Can't find head in an Empty list!"
-- How does haskell break the list into x(first) and xs(rest)?
head' (x:xs) = x
我读过[1,2,3]是1:2:3:[]的语法糖。那么,:是一个函数,它接受任何参数并添加到右侧参数?该列表如何向后爆炸成两个变量head和rest?[
我试图创建一个Haskell函数来生成两个列表的笛卡儿乘积。
以下是我的尝试:
cartesianProduct :: (a -> b -> c) -> [a] -> [b] -> [c]
cartesianProduct f x [] = x
cartesianProduct f y [] = y
cartesianProduct = f x y unionHelper func1 f xs ys