标签: pointfree

在Haskell中讨论3个参数

我在使用函数来删除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)

然后,卡住了.我们无法弄清楚如何避免使用最后一个参数.我知道我以前见过类似的情况并且有一个解决方案. …

haskell pointfree

7
推荐指数
3
解决办法
916
查看次数

计算列表中每个元素的频率

我尝试编写一个程序,它将计算列表中每个元素的频率.

    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')]这里..

haskell pointfree

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

F#可以重构为无点样式吗?

在研究与编程相关的主题时,我在lambdabot中遇到了Haskell的一个无点重构工具,并想知道F#是否可以重构为无点样式?

我不是主张使用无点样式,而是将其视为更好地理解函数的一种方法.

注意:pad回答了这个问题的早期版本,但我重写了这个问题,因为答案对于其他学习和使用F#的人来说是有价值的,我不希望因为一些接近的投票而删除它.

注意:仅仅因为我改变了问题,不要认为答案意味着无法使用F#编写一个自由点样式.它可以在很多情况下完成,但你必须遵守限制.

f# pointfree

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

Haskell函数组成 - (a - > b) - >(a - > c) - >(b - > c - > d) - >(a - > d)

我想了解如何以无点方式完成以下工作:

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 - …

lambda haskell pointfree function-composition

7
推荐指数
3
解决办法
337
查看次数

根据长度过滤子集?

尝试使用过滤器提取长度为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的新手,所以不确定。

lambda haskell list function-call pointfree

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

点免费功能能够内联吗?

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即使myfunctioninlined正确的也不会得到,是否正确?

那么这可以被视为咖喱功能的缺点之一吗?

f# inline currying pointfree

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

haskell中的点运算符,具有多参数功能

我想在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 pointfree dot-operator

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

Pointfree版本没有编译,但有点的版本呢?

我想写一个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 types combinators pointfree function-composition

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

是否有一种无条件的方法将条件检查转换为输入的Maybe类型?

我只是在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语句控制数据流,我不确定是否有一种干净的方法.

haskell pointfree maybe

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

默认写{(+/3&lt;???6)×100÷?}1000

受到一些 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

\n

apl pointfree tacit-programming

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