我在Haskell中定义了以下类型:
data AE = Num Float
| Add AE AE
| Sub AE AE
| Mult AE AE
| Div AE AE
deriving(Eq, Read, Show)
现在我如何解构它呢?具体来说,我应该如何完成一个函数,如下所示:
testFunct :: AE -> something
testFunct expression
| if type Num = do this
| if type Add = then do this
我正在解决99个Haskell问题。我成功地解决了第21号问题,当我打开时,提出了以下解决方案:
将给定位置的元素插入到列表中。
insertAt :: a -> [a] -> Int -> [a]
insertAt x xs (n+1) = let (ys,zs) = split xs n in ys++x:zs
我发现模式(n + 1)很有趣,因为它似乎是一种优雅的方法,可以将insertAt的基于1的参数转换为基于0的split参数(这是以前练习中的函数,本质上与splitAt相同)。问题是,GHC并不认为这种模式那么优雅,实际上它说:
模式中的解析错误:n+
需要从一个已经离开的开发人员那里修补一个Haskell项目,但我是一个完整的Haskell。
尝试编写一个函数,返回匹配模式的所有Redis键的计数。交互作用下,它看起来如下:
*MyProj S R U>let res = runRedis conn $ keys "MP:Users*"
*MyProj S R U> res
Right ["MP:Users:00:13:95:12:7D:85","MP:Users:00:13:95:12:7D:84","MP:Users:APP"]
*MyProj S R U>
我正在试着写一个Haskell追加函数...这就是我所拥有的:
myappend :: [a] -> [a] -> [a]
myappend [] x = x
myappend [x:xs] y = x : myappend xs y
但它给了我一个错误:发生检查:当泛化‘`myappend’的类型时,无法构造无限类型:a=a
所以,很明显它出了点问题,但我看不出来...我的append函数有什么问题?
在Haskell中,你可以这样写:
x :: (Int,Int) -> Int
x (p,s) = p
在Scala中,你可以这样写:
def x(a: (Int, Int)) = a._1
或者:
def x(a: (Int, Int)) = a match {
case (p, s) => p
}
为什么不像这样
def x(_: (p: Int, s: Int)) = p
或
def x(foo: (p @ Int, s @ Int)) = p
我刚开始学习haskell和模式匹配。我只是不明白它是如何实现的,[]和(x:_)的计算结果是不同的类型,这种模式的函数实现由于多态性而被识别,或者我错了,还有另一种使用的技术。
head' :: [a] -> a
head' [] = error "Can't call head on an empty list, dummy!"
head' (x:_) = x
或者让我们考虑这个模式匹配函数:
tell :: (Show a) => [a] -> String
tell [] = "The list i
总的来说,我对Haskell和编程非常陌生。我试图在不使用来自sum的Data.List函数的情况下添加列表的内容。到目前为止,我得到的是:
module Summ
where
summ :: [Int] -> Int
summ xs =
if null xs == False
then let y = x + (head xs)
let xs = tail xs
else print y
我很确定这段代码有很多错误,但目前最新的错误是else语句的“输入上的解析错误”。怎么了?
我有一个向量类,有两个解构方法,如下所示:
public readonly struct Vector2
{
public readonly double X, Y;
...
public void Deconstruct( out double x, out double y )
{
x = this.X;
y = this.Y;
}
public void Deconstruct( out Vector2 unitVector, out double length )
{
leng
在理查德·伯德的书“使用Haskell的函数式编程简介”第二版中做练习。在下面代码的最后一行中,我得到了错误:
“模式中的分析错误(n times Succ m)
请注意,在times的定义中接受了相同的模式(m和n互换)。我为什么要犯这个错误?
data Nat = Zero | Succ Nat
deriving (Eq, Ord, Show)
plus :: Nat -> Nat -> Nat
m `plus` Zero = m
m `plus` Succ n = Succ (m `plus` n)
m `times
我想要定义一个函数,它不考虑参数的顺序,而是考虑其类型相同的参数。例如:
weirdCommutative :: Int -> Int -> Int
weirdCommutative 0 1 = 999
weirdCommutative x y = x + y
我希望这个函数实际上是可交换的。一个选项是添加模式:
weirdCommutative 1 0 = 999
甚至更好:
weirdCommutative 1 0 = weirdCommutative 0 1
现在来看一下一般情况:可能有两个以上的参数和/或两个值,需要在没有顺序的情况下考虑--所以考虑所有可能的情况变得很棘手
我试图在Haskell中反转一个列表,然后使用反向列表并对其做一些工作,但我不知道如何做,因为Haskell选择了第三行,忽略了我的最后一行代码
注意:我知道我有模式匹配重叠,但我不知道如何修复它。
这就是我所拥有的:
test :: (a -> Bool) -> [a] -> [a]
test _ [] = []
test _ (x:xs) = reverse xs ++ [x]
test func (x:xs)
我试图像这样使用where子句:
test :: (a -> Bool) -> [a] -> [a]
test _ [] = []
test f
这是一个我一直想知道的问题。如果语句在大多数编程语言中都是主要的(至少在我使用过的编程语言中是如此),但在Haskell中,它似乎很不受欢迎。我知道对于复杂的情况,Haskell的模式匹配比一堆is要简洁得多,但有什么真正的区别吗?
举个简单的例子,拿一个自制版本的sum为例(是的,我知道它可能就是foldr (+) 0):
sum :: [Int] -> Int
-- separate all the cases out
sum [] = 0
sum (x:xs) = x + sum xs
-- guards
sum xs
| null xs = 0
| otherw
当模式匹配用例类时,如何实际引用它所匹配的类?
这里有一个例子来说明我的意思:
sealed trait Value
case class A(n: Int) extends Value
v match {
case A(x) =>
doSomething(A);
}
其中,v的类型为值,而doSomething接受A类型的参数,而不是Value。
为了在Haskell的道路上取得先机,我选择了这本书的创作者之一Hudak。所以,我正在进行关于哈斯克尔的介绍。
我被困在试图理解以下声明:
从技术上讲,形式参数也是模式,但它们总是与值匹配。
从我对C这样的语言(或者广义地说是非函数式语言)的小而大的习惯来看,我可以形成形式参数是函数定义中的参数。因此,假设C中有一个类似于下面的函数:
int func_add(int a, int d)
然后,如果我是正确的,传递其他类型的值(如字符串)将是模式匹配的失败。因此,调用func_add作为func_add("trs", 5)是模式不匹配的一种情况。
由于极有可能出现错
我目前正在从这里研究Haskell中的模式匹配。作者给出了实现"head“函数(返回列表的第一个元素)的示例如下:
head' (x:_) = x
他有点解释了接线员的用法,但我不太清楚。据我所知,我们可以使用它在列表前面追加元素:
5:[6,7] will give [5,6,7]
不过,我看不出如何将“:”运算符作为参数(x:_)或(x:xs)的一部分使用。
绑定第一个元素到x的绑定机制是如何工作的?
所以我想在Haskell中做一个简单的字符串反转函数
swapReverse :: String => String
swapReverse [x] = [x]
swapReverse [x,y] = [y,x]
swapReverse (x:xs:l) = -- pattern match fails here
let last = [l]
middle = xs
first = [x]
in last ++ swapReverse middle ++ first
那么有没有办法在haskell中定义一个包含first和last元
考虑下面的Haskell代码。
data Keypress = Keypress Int Char
getSeq :: Keypress -> [Char]
getSeq (Keypress i c) = replicate i c
有什么方法可以用无点形式编写getSeq 吗?
getSeq的定义非常类似于它的模式匹配,因此似乎有一些方法可以使用赛跑或单数,或者某种东西来避免指定i和c参数。然而,由于模式匹配,并没有解析getSeq的无点输出。
有可能吗?
我试图在一个列表中对3个元素进行排序。但是我很难把它翻译到haskell。在haskell中可以做嵌套的if语句吗?我一直在尝试模式匹配,但这需要花费很长时间。
if (x < y) {
if (z < x) swap(x,z);
} else {
if (y < z) swap(x,y);
else swap(x,z);
}
if(z<y) swap(y,z);
这就是我试过的
intCMP :: Int -> Int -> Ordering
intCMP a b | a == b =EQ
| a < b =
即使没有扩展ExistentialQuantification,Haskell也通过类型同构为任何类型的C支持一些存在类型,
(forall a. C a => (a -> b)) ~ ((exists a. C a => a) -> b)
因此,函数f :: C a => a -> b需要一个类型为exists a. C a的参数x。但是Haskell不允许模式匹配x与某些类型的C (由野生匹配_完成,因为类型类通常是无限的)。
这很奇怪,因为存在型是广义和类型。Haskell使用data关键字支持有限和类型,并允许它们进行模式匹配。在C++、Java
我正在努力学习一个Haskell,以便跟上Haskell的基本知识。我对函数式编程和模式匹配都很满意,但后者更多的是关于Mathematica是如何做到的。
本着与第4.1章head的天真实现相同的精神,我对last进行了天真的实现,具体如下:
last1 :: [a] -> a
last1 (_:x:[]) = x
但是,调用last1 [1,2,3,4]会给出一个错误Exception: ... Non-exhaustive patterns in function last1。我理解这个错误意味着指定的模式并不包括所有可能的输入,而且通常,一个捕获所有模式是必要的(我还没有提供)。