小编Ale*_*har的帖子

如何阅读"Num(a - > b - > a)=> a - > [b] - > a"定义

我试图了解Haskell函数定义.我把它的定义带到了foldl函数

:t foldl
foldl :: (a -> b -> a) -> a -> [b] -> a
Run Code Online (Sandbox Code Playgroud)

现在第一个参数是一个函数,所以如果我传递它,这就是剩下的:

:t foldl (+)
foldl (+) :: Num b => b -> [b] -> b
Run Code Online (Sandbox Code Playgroud)

我读作"一个获取数值并返回带数组的函数的函数".

现在,第一个参数真的是一个功能吗?它可以被解读为

foldl :: a -> b -> a -> a -> [b] -> a
Run Code Online (Sandbox Code Playgroud)

代替?

我试过传递一个数值,这是我得到的:

foldl 4 :: Num (a -> b -> a) => a -> [b] -> a
Run Code Online (Sandbox Code Playgroud)

问题是......你怎么读这个?我不明白我有什么.

haskell

6
推荐指数
1
解决办法
263
查看次数

Haskell错误:"非详尽模式"

所以我有这个功能,当我尝试使用它时:mergeSortedLists [1,1] [1,1]它给了我一个错误:

[1,1***例外:SortFunctions.hs:(86,1) - (91,89):函数mergeSortedLists中的非详尽模式

85 mergeSortedLists :: (Ord t)       => [t] -> [t] -> [t]
86 mergeSortedLists [] []            = []
87 mergeSortedLists (x:[]) []        = x:[]
88 mergeSortedLists [] (y:[])        = y:[] 
89 mergeSortedLists (x:[]) (y:[])    = (max x y) : (min x y) : []
90 mergeSortedLists (x:tail1) (y:tail2) | x > y  = x : (mergeSortedLists tail1     (y:tail2))
91                                      | otherwise = y : (mergeSortedLists (x:tail1) tail2)
Run Code Online (Sandbox Code Playgroud)

我无法找出问题的根源,因为我认为我已经涵盖了所有可能的情况.这可能是什么问题?

haskell pattern-matching

3
推荐指数
1
解决办法
1270
查看次数

绑定值不是第一个参数

我有一个名为"人"的班级

Person :: String -> String -> Int -> Gender -> Person
Run Code Online (Sandbox Code Playgroud)

目标: 通过将性别分配给女性来制作更一般的人物版本,女性角色.

什么有效: 绑定前N个元素有效:

let personsWithNameAlice = Person "Alice"
let personsWithNameAliceMcGee = Person "Alice" "McGee"
Run Code Online (Sandbox Code Playgroud)

什么行不通:

let femalePerson = Person {gender = Female}
Run Code Online (Sandbox Code Playgroud)

题:

  • 我该怎么做呢?
  • 如何将值绑定到n!= 0的任何函数的第n个元素?

只是我知道我可以在数学中编写f(x,y,z)= g(x,y,z,5),在C++中编写std :: bind2nd(f,8)所以不应该在Haskell中编写?

haskell currying

3
推荐指数
2
解决办法
787
查看次数

Onclick不应该触发表单数据提交

我刚刚发现,每次onclick<button>放置内部<form>标签的事件触发时,表单都会像点击一样提交数据<input type='submit'>.我不希望这样.我的表单中的按钮服务于其他任务,表单不应该在我点击其中一个后提交数据.

为了更清楚,我想要这个代码:

<form action="http://www.google.com" method="POST">
    <button onclick="alert('hi!')">Button</button>
    <br>
    <input type="submit" value="submit"/>
</form>
Run Code Online (Sandbox Code Playgroud)

显示警报"嗨!" 当我点击按钮时,它不应该在那之后打开谷歌.它应该只在我按"提交"时显示谷歌.

html javascript

2
推荐指数
1
解决办法
2922
查看次数

函数定义中的模板数据类型

我的程序中有两个函数:

getWidth :: Size -> GLint
getWidth (Size a b) = a

getXPos :: Position -> GLint
getXPos (Position a b) = a
Run Code Online (Sandbox Code Playgroud)

我意识到这两个函数正在做同样的事情,唯一的区别是参数类型.问题是:我如何编写这样的通用函数:

getFirst :: ANYTHING -> a
getFirst (ANYTHING a b) -> a
Run Code Online (Sandbox Code Playgroud)

haskell

2
推荐指数
2
解决办法
113
查看次数

评估任何(... - > IO())函数的函数

在main中几个函数输出信息.

我需要测量他们的执行时间.

目前它是这样做的:

  start <- getCurrentTime
  putStrLn $ show $ findNthMinLinear (getTestArrayOfLength (read arrlength :: Int)) 4
  stop <- getCurrentTime
  print $ diffUTCTime stop start
Run Code Online (Sandbox Code Playgroud)

我想将每个函数包装在一个函数中,该函数记住时间2.评估函数3.记住时间4.打印两次记忆时间之间的差异

问题是我不知道如何在不首先评估它的情况下传递函数.

我的猜测是,如果我写(<5)例如,那就是我创建一个返回函数的函数,直到我传递最终参数我才会做真正的工作吗?然后我可以写

printAndMeasure :: (a -> IO()) -> IO ()
...
printAndMeasure \x -> (getTestArrayOfLength (read arrlength :: Int)) 4
Run Code Online (Sandbox Code Playgroud)

但这是一个草率的解决方案,因为我不需要这个x,除了保持执行功能.

lambda haskell

1
推荐指数
1
解决办法
122
查看次数

标签 统计

haskell ×5

currying ×1

html ×1

javascript ×1

lambda ×1

pattern-matching ×1