小编Cli*_*ton的帖子

`foldr`或其他高阶函数的一般性

这是一个简单的函数,它接受一个列表和一个数字,如果列表的长度大于该数字,则可以计算出来.

例如

compareLengthTo [1,2,3] 3 == EQ
compareLengthTo [1,2] 3 == LT
compareLengthTo [1,2,3,4] 3 == GT
compareLengthTo [1..] 3 == GT
Run Code Online (Sandbox Code Playgroud)

请注意,它有两个属性:

  1. 它适用于无限列表.
  2. 它是尾递归并使用恒定空间.
import Data.Ord

compareLengthTo :: [a] -> Int -> Ordering
compareLengthTo l n = f 0 l
  where
    f c [] = c `compare` n
    f c (l:ls) | c > n = GT
               | otherwise = f (c + 1) ls
Run Code Online (Sandbox Code Playgroud)

有没有办法只compareLengthTo使用foldr

请注意,这里有一个版本的compareLengthTo使用drop:

compareLengthToDrop :: [a] -> …
Run Code Online (Sandbox Code Playgroud)

algorithm haskell

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

将Functor推入元组

我已经简化了我需要的一些代码的类型签名,它看起来大致如下:

Functor f => f (Maybe a, b) -> (Maybe (f a), f b)
Run Code Online (Sandbox Code Playgroud)

我可以,我该如何实现这样的功能?如果是这样,怎么样?我猜想我需要将仿函数推向使用Traversable,但是我无法将这一切都放在我脑海中.

haskell

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

如何编写带有签名“(Proxy a -> s) -> Proxy (Maybe a) -> Maybe s”的函数

根据标题,我希望编写一个具有以下签名的函数。

g :: (Proxy a -> s) -> Proxy (Maybe a) -> Maybe s
g f x = ...
Run Code Online (Sandbox Code Playgroud)

对于我的用例来说,fsymbolVal. 我可以symbolVal在平原上运行KnownSymbol a => a,但我无法让它工作KnownSymbol a => Maybe a

haskell

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

创建实例而不需要新类型虚拟对象

可以说我有以下内容:

class C a where
  f :: a -> Blah  

f_impl_for_d :: D a => a -> Blah
f_impl_for_d = _ 

newtype Alice f a = Alice (f a)
Run Code Online (Sandbox Code Playgroud)

也许一些现有的实例是这样的:

instance C a => C [a] where ...
instance C a => C (Identity a) where ... 
instance C a => C (Maybe a) where ...
Run Code Online (Sandbox Code Playgroud)

我想要的是这样的实例:

instance (D a, C a => C (f a)) => C (Alice f a)
Run Code Online (Sandbox Code Playgroud)

就像,只要D a有效,并且有一个C (f a)带有约束的实例 …

haskell typeclass

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

Perl目录连接

是否有一个函数说f(在基本Perl或库中),这样:

f("/a/b/c", "./d") == "/a/b/c/d"
f("/a/b/c", "../d") == "/a/b/d"
f("/a/b/c", "/d") == "/d"
Run Code Online (Sandbox Code Playgroud)

基本上,它返回重复生成的目录cd.

perl path absolute-path

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

附加monad

只是putChar我可以做这样的事情:

f = 
  do
    putChar 'a'
    putChar 'b'
    g
    putChar 'f'
    putChar 'g'

g =
  do
    putChar 'c'
    putChar 'd'
    putChar 'e'
Run Code Online (Sandbox Code Playgroud)

当我"跑"这个(通过说main = f)时我会发现它只是按顺序打印出来的字符.

我正在寻找的是非IO版本.有点像这样的东西:

f = 
  do
    append 'a'
    append 'b'
    g
    append 'f'
    append 'g'

g =
  do
    append 'c'
    append 'd'
    append 'e'
Run Code Online (Sandbox Code Playgroud)

而且还有一个功能 runAppend :: t a -> [a]

这样runAppend f=['a','b','c','d','e','f','g']

当然,我希望它在线性时间内运行(即不会遇到类似于++以错误顺序进行连接的问题).

这似乎是一个相当常见的用例,所以我猜它存在,如果有人能指出我会那么好,我不想重新发明轮子.

monads haskell

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

撰写应用功能

请执行功能:

composeApplicative :: (Applicative f) => f (b -> c) -> f (a -> b) -> f (a -> c)
Run Code Online (Sandbox Code Playgroud)

这样:

(composeApplicative f g) <*> x == f <*> (g <*> x)
Run Code Online (Sandbox Code Playgroud)

或者,解释为什么不能这样做?

haskell functor function-composition applicative

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