我在使用函数来删除Haskell中的三个参数时遇到了麻烦.
免责声明:不是课程作业,今天有人在挣扎着问我这个问题,这一直困扰着我.
我们给出的自定义类型/函数是(只能记住类型)
type MyThing
= (Char, String)
type MyThings
= [MyThing]
funcA :: MyThings -> String -> String
funcB :: MyThings -> String -> Int -> String
Run Code Online (Sandbox Code Playgroud)
我们开始:
funcB as str n = iterate (funcA as) str !! n
Run Code Online (Sandbox Code Playgroud)
并将其减少如下:
funcB as str n = iterate (funcA as) str !! n
funcB as str = (!!) . (iterate (funcA as)) str
funcB as = (!!) . (iterate (funcA as))
funcB as = (!!) . (iterate . funcA) as
Run Code Online (Sandbox Code Playgroud)
然后,卡住了.我们无法弄清楚如何避免使用最后一个参数.我知道我以前见过类似的情况并且有一个解决方案. …
我尝试编写一个程序,它将计算列表中每个元素的频率.
In: "aabbcabb"
Out: [("a",3),("b",4),("c",1)]
Run Code Online (Sandbox Code Playgroud)
您可以在以下链接中查看我的代码:http://codepad.org/nyIECIT2 在此代码中,唯一函数的输出将是这样的
In: "aabbcabb"
Out: "abc"
Run Code Online (Sandbox Code Playgroud)
使用唯一的输出我们将计算目标列表的频率.你也可以在这里看到代码:
frequencyOfElt xs=ans
where ans=countElt(unique xs) xs
unique []=[]
unique xs=(head xs):(unique (filter((/=)(head xs))xs))
countElt ref target=ans'
where ans'=zip ref lengths
lengths=map length $ zipWith($)(map[(=='a'),(==',b'),(==',c')](filter.(==))ref)(repeat target)
Error:Syntax error in input (unexpected symbol "unique")
Run Code Online (Sandbox Code Playgroud)
但在ghci 6.13中也出现了其他类型的错误
很少有人问我使用[(=='a'),(==',b'),(==',c')]的目的是什么.我的期望:如果ref ="abc"和target ="aabbaacc"那么
zipWith($) (map filter ref)(repeat target)
Run Code Online (Sandbox Code Playgroud)
将显示["aaaa","bb","cc"]然后我可以使用这里的地图长度来获得频率这里的过滤列表根据ref我使用[(=='a'),(==' ,b '),(==',C')]
我假设一些逻辑错误在于[(=='a'),(==',b'),(==',c')]这里..
在研究与编程相关的主题时,我在lambdabot中遇到了Haskell的一个无点重构工具,并想知道F#是否可以重构为无点样式?
我不是主张使用无点样式,而是将其视为更好地理解函数的一种方法.
注意:pad回答了这个问题的早期版本,但我重写了这个问题,因为答案对于其他学习和使用F#的人来说是有价值的,我不希望因为一些接近的投票而删除它.
注意:仅仅因为我改变了问题,不要认为答案意味着无法使用F#编写一个自由点样式.它可以在很多情况下完成,但你必须遵守限制.
我想了解如何以无点方式完成以下工作:
withinBounds :: [Int] -> Bool
withinBounds xs = (all (>= 0) xs) && (all (<= 8) xs)
Run Code Online (Sandbox Code Playgroud)
我明白,出于可读性/理智的考虑,以这种方式编写它是优越的,但我想更多地了解如何编写函数.我一直在摸索着如何做到这一点.整个(扩展?)类型签名是
[Int] -> ([Int] -> Bool) -> ([Int] -> Bool) -> (Bool -> Bool -> Bool) -> Bool
Run Code Online (Sandbox Code Playgroud)
我想要的组合的类型签名是
(a -> b) -> (a -> c) -> (b -> c -> d) -> (a -> d)
Run Code Online (Sandbox Code Playgroud)
我用以混蛋 - lambda形式的笔记写下了以下内容.如果有一种方法可以在某种程度上简化lambda演算的问题,那么如果可以解释它也会很棒:
\L@[] -> \f1@([] -> Bool) -> \f2@([] -> Bool) -> \f3@(Bool -> Bool -> Bool) -> f3.(f1.L).(f2.L)
Run Code Online (Sandbox Code Playgroud)
在上面,.是应用程序,@正在捕获(所以f3是(Bool - …
尝试使用过滤器提取长度为k的子集。不确定如何处理?该列表包含100个元素。
subsets :: [a] -> [[a]]
subsets [] = [[]]
subsets (x:xs) = [zs | ys <- subsets xs, zs <- [ys, (x:ys)]]
Run Code Online (Sandbox Code Playgroud)
如果我使用过滤器,这就是我的想法:
filter (length(3)) subsets [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)
但是我可能错了。如果有其他方法而不是过滤器?我是Haskell的新手,所以不确定。
let inline myfunction x y = ...
let inline mycurried = myfunction x // error, only functions may be marked inline
Run Code Online (Sandbox Code Playgroud)
显然inlinecurried函数似乎是不可能的.因此,无论何时mycurried被调用,inlined即使myfunction是inlined正确的也不会得到,是否正确?
那么这可以被视为咖喱功能的缺点之一吗?
我想在haskell中编写一个无点函数,为了简单起见,我想说要创建这个函数:
maxmin :: Ord a => a -> a -> a -> a
maxmin a b c = max a (min b c)
Run Code Online (Sandbox Code Playgroud)
我可以改进这个
maxmin a b = (max a) . (min b)
Run Code Online (Sandbox Code Playgroud)
但有没有办法摆脱a和b?
我想写一个Haskell函数,它返回一个附加到自身计数次数的列表(比如lst * count在Python中).
我的第一次尝试是:
self_append_n :: Int -> [a] -> [a]
self_append_n = concat . replicate
Run Code Online (Sandbox Code Playgroud)
我的理由是replicate接受一个计数和一个值,并产生一个值列表.当值本身就是一个列表时,剩下的就是将列表连接在一起.但是,这给出了一个令人困惑的错误:
Couldn't match type `[a0]' with `[a] -> [a]'
Expected type: [[a0]] -> [a] -> [a]
Actual type: [[a0]] -> [a0]
In the first argument of `(.)', namely `concat'
In the expression: concat . replicate
In an equation for `self_append_n':
self_append_n = concat . replicate
Run Code Online (Sandbox Code Playgroud)
然后我写了一个有点版本:
self_append_n a b = concat $ replicate a b
Run Code Online (Sandbox Code Playgroud)
它的工作原理!
为什么无点编译无法编译,但添加点可以使它工作?
我只是在haskell中进行一些简单的练习,并且想知道是否有一种将if-then-else语句转换为Maybe类型的无点方法:Nothing如果条件为false则返回,Just如果条件为true则返回.
总之,给定一些:
maybeIf :: (a -> Bool) -> a -> Maybe a
maybeIf cond a = if cond a then Just a else Nothing
Run Code Online (Sandbox Code Playgroud)
是否有一个无点的实现a?我也一直在寻找一个更具体的版本a -> Maybe a,并且觉得某处可能有答案Control.Arrow.但是,由于Maybe是数据类型和if-else语句控制数据流,我不确定是否有一种干净的方法.
受到一些 Conor Hoekstra YouTube 视频的启发,我尝试在 APL 中做一些小步骤,并将我的小线条转换为无点样式。但对于这个(1000 个骰子 6 卷中 4、5 或 6 卷的百分比)我无法理解如何在重塑之前消除 omega。
\n{(+/3<?\xe2\x8d\xb5\xe2\x8d\xb46)\xc3\x97100\xc3\xb7\xe2\x8d\xb5}1000