gpt4 book ai didi

haskell - Haskell、类型定义和防护的练习

转载 作者:行者123 更新时间:2023-12-02 17:12:42 26 4
gpt4 key购买 nike

第一个问题:
定义一个使用分隔符值将列表列表连接在一起的函数。
类型定义应该是这样的:

intersperse :: a -> [[a]] -> [a]

分隔符应出现在列表元素之间,但不应位于最后一个元素之后。
您的函数应如下所示:


ghci> :load Intersperse
[1 of 1] Compiling Main ( Intersperse.hs, interpreted )
Ok, modules loaded: Main.
ghci> intersperse ',' []
""
ghci> intersperse ',' ["foo"]
"foo"
ghci> intersperse ',' ["foo","bar","baz","quux"]
"foo,bar,baz,quux"

过了一段时间我设法解决了这个问题:


intersperse myChar lists
| lists == [] = ""
| otherwise = attach myChar lists
where attach myChar (x:[]) = x
attach myChar (x:xs) = x ++ (myChar : []) ++ attach myChar xs

但是,如您所见,它没有类型定义。
如果我将类型定义放在函数上方,则会收到错误。为什么?

第二个问题:
在找到这个解决方案之前,我想在守卫列表中添加另一个守卫。这个四方应该在第一个守卫之后。我想检查列表变量中是否只有一个列表,所以我只返回列表变量。但我不能做这样的守卫(再次,错误出现了:-)):


| lists == (x:[]) = lists

这也不起作用:


| lists == (_:[]) = lists
为什么为什么为什么? :-)。

在此之后我尝试做其他守卫:


| length lists == 1 = lists

但它也引发了一个错误。

(顺便说一句,我不需要那些守卫,因为我发现“where”关键字之后的第一个模式正是我想要的。
这就是我的意思:
附加 myChar(x:[]) = x

但是,我仍然想了解为什么我尝试过的四方不起作用。另外,我幸运地找到了这个解决方案,我不认为每次我都会注意到这样的事情:-)

非常感谢:-)。

附:这个练习来自书real world haskell .

最佳答案

  1. "" 的类型为 [Char],但您的类型签名表示 intersperse 返回 [a] ,其中 a 取决于输入类型,因此类型不匹配。

  2. 我认为你不能在守卫内部进行模式匹配。

    对于这个守卫

    | length lists == 1    = lists

    lists 的类型为 [[a]],但您应该返回 [a]。也就是说,如果 lists["foo"],则您希望返回 "foo"。您不想返回["foo"]

关于haskell - Haskell、类型定义和防护的练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2057093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com