我试图了解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)
问题是......你怎么读这个?我不明白我有什么.
所以我有这个功能,当我尝试使用它时: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)
我无法找出问题的根源,因为我认为我已经涵盖了所有可能的情况.这可能是什么问题?
我有一个名为"人"的班级
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)
题:
只是我知道我可以在数学中编写f(x,y,z)= g(x,y,z,5),在C++中编写std :: bind2nd(f,8)所以不应该在Haskell中编写?
我刚刚发现,每次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)
显示警报"嗨!" 当我点击按钮时,它不应该在那之后打开谷歌.它应该只在我按"提交"时显示谷歌.
我的程序中有两个函数:
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) 我在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,除了保持执行功能.